2011-08-24 14 views
25

Tengo una lista de elementos que quiero mostrar en Canvas utilizando el enlace de datos.Cómo mostrar elementos en Canvas mediante Enlace

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 es una clase simple con propiedades de auto para el texto, Superior e Izquierda valores

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

Cuando databind los artículos, que aparecen en el lienzo. Pero los elementos no aparecen en las posiciones mencionadas utilizando las propiedades Superior e Izquierda.

<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 utiliza StackPanel como ItemsPanel predeterminado. el bloque de texto que está agregando en realidad está agregando a un panel de distribución pero no a un lienzo. ItemsControl está agregando al lienzo. Intente cambiar el panel de elementos a lienzo – Bathineni

+0

Gracias por la respuesta bathineni. Intenté poner ItemsPanel como Canvas pero no funcionó. Los elementos comenzaron a mostrar uno sobre el otro. Agregar el ItemContainerStyle funcionó. –

+0

posible duplicado de [WPF: ¿Es posible enlazar una propiedad de Canvas's Children en XAML?] (Http://stackoverflow.com/questions/889825/wpf-is-it-possible-to-bind-a-canvass-children -property-in-xaml) –

Respuesta

37

Establecer la ItemsPanel a un Canvas y se unen los recipientes en lugar de la TextBlock en el 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

Si tengo 'Shape' en vez de' TextBlock' ¿puedo simplemente reemplazar uno con el otro? – IAbstract

+0

Además, ¿dónde reside 'ItemsControl' en el árbol de documentos? – IAbstract

+0

ItemsControl.ItemsContainerStyle era justo lo que necesitaba. Tengo el resto funcionando. Muchas gracias. – Grenter

Cuestiones relacionadas