2011-08-24 11 views
25

Ho una lista di elementi che voglio visualizzare in Canvas usando l'associazione dati.Come visualizzare gli elementi nella tela attraverso il binding

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 è una semplice classe con proprietà di auto per il testo, Top e Left valori

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

Quando ho DataBind gli articoli, lo fanno apparire in tela. Ma gli oggetti non appaiono nelle posizioni menzionate usando le proprietà Top e Left.

<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 utilizza StackPanel come ItemsPanel predefinita. il blocco di testo che si sta aggiungendo è in realtà aggiunto a uno stackpanel ma non alla tela. ItemsControl sta aggiungendo al canvas. Prova a cambiare pannello degli elementi su tela – Bathineni

+0

Grazie per la risposta bathineni. Ho provato a mettere ItemsPanel come Canvas ma non ha funzionato. Gli oggetti iniziarono a mostrarsi uno sopra l'altro. Aggiunta di ItemContainerStyle funzionante. –

+0

possibile duplicato di [WPF: è possibile associare la proprietà Children di una tela in XAML?] (Http://stackoverflow.com/questions/889825/wpf-is-it-possible-to-bind-a-canvass-children -property-in-xaml) –

risposta

37

Impostare la ItemsPanel ad un Canvas e legare i contenitori al posto del TextBlock nel 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

Se ho un 'Shape' invece di un' TextBlock' posso semplicemente sostituire uno con l'altro? – IAbstract

+0

Inoltre, dove si trova 'ItemsControl' nell'albero del documento? – IAbstract

+0

ItemsControl.ItemsContainerStyle era proprio quello di cui avevo bisogno per far funzionare il resto. Grazie mille. – Grenter

Problemi correlati