2011-08-24 11 views
25

Veri bağlama özelliğini kullanarak Canvas'da görüntülemek istediğim öğeler listesi var.İç Bağlama yoluyla Tuval'te öğeler nasıl görüntülenir

ItemsToShowInCanvas = new ObservableCollection<ItemDetail> 
    { 
     new ItemDetail {Text = "ABC", Top = 10, Left = 200}, 
     new ItemDetail {Text = "DEF", Top = 100, Left = 300}, 
     new ItemDetail {Text = "PQR", Top = 50, Left = 150} 
    }; 

ItemDetail Metin oto özelliklere sahip basit bir sınıftır, Üst ve Sol ı öğeleri databind, onlar tuvalinde görünüyor

public class ItemDetail 
{ 
    public string Text { get; set; } 
    public double Top { get; set; } 
    public double Left { get; set; } 
} 

değer verir. Ancak öğeler, Üst ve Sol özellikleri kullanılarak belirtilen konumlarda görünmez.

<Canvas> 
    <ItemsControl ItemsSource="{Binding Path=ItemsToShowInCanvas}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=Text}" Canvas.Top="{Binding Path=Top}" Canvas.Left="{Binding Path=Left}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Canvas> 
+2

ItemsControl TextBlock bağlayan varsayılan itemspanel olarak stackpanel kullanır ayarlayın. eklediğiniz textblock aslında bir yığın kağıdına ekleniyor ama tuvalete eklemiyor. ItemsControl tuvale ekliyor. – Bathineni

+0

tuval için itemspanel değiştirmeyi deneyin Cevabı bathineni için teşekkürler. ItemsPanel'ı Canvas olarak koymaya çalıştım ama işe yaramadı. Öğeler diğerinin üzerinde göstermeye başladı. ItemContainerStyle eklendiğinde çalıştı. –

+0

olası kopyası [WPF: Bir Canvas'ın Çocuk XAML'deki özelliğini bağlamak mümkün mü?] (Http://stackoverflow.com/questions/889825/wpf-is-it-possible-to-bind-a-canvass-children -property-in-xaml) –

cevap

37

bir Canvas için ItemsPanel ve konteyner yerine DataTemplate

<ItemsControl ItemsSource="{Binding Path=ItemsToShowInCanvas}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
     <Style TargetType="ContentPresenter"> 
      <Setter Property="Canvas.Left" Value="{Binding Left}"/> 
      <Setter Property="Canvas.Top" Value="{Binding Top}"/> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=Text}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

Eğer 'TextBlock' yerine bir 'Shape'im varsa, birini diğeriyle değiştirebilir miyim? – IAbstract

+0

Ayrıca, "ItemsControl" belge ağacında nerede bulunur? – IAbstract

+0

ItemsControl.ItemsContainerStyle tam ihtiyacım olan şeydi. Bir demet teşekkür ederim. – Grenter

İlgili konular