2011-08-24 2 views
25

데이터 바인딩을 사용하여 Canvas에 표시 할 항목 목록이 있습니다.Binding을 통해 Canvas에 항목을 표시하는 방법

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은 텍스트에 대한 자동 특성을 가진 간단한 클래스이며, 상단과 왼쪽 내가 항목을 데이터 바인딩 할 때, 그들은 캔버스에 나타나지 않습니다

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

값. 그러나 항목은 Top 및 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에 TextBlock의 결합은 기본 itemspanel로서 사용 StackPanel에 설정한다. 추가하려는 텍스트 블록은 실제로 스택 패널에 추가되지만 캔버스에는 추가되지 않습니다. ItemsControl이 캔버스에 추가됩니다. 항목 패널을 캔버스로 바꿔보십시오. – Bathineni

+0

답변 주셔서 감사합니다. ItemsPanel을 Canvas로 넣으려고했으나 작동하지 않았습니다. 항목이 서로 위에 표시되기 시작했습니다. ItemContainerStyle을 추가하면 효과적입니다. –

+0

[WPF : Canvas의 Children 속성을 XAML에 바인딩 할 수 있습니까?] (http://stackoverflow.com/questions/889825/wpf-is-it-possible-to-bind-a-canvass-children) -property-in-xaml) –

답변

37

Canvas-ItemsPanel 및 용기 대신 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

'TextBlock' 대신'Shape'을 사용하면 간단히 다른 것을 대체 할 수 있습니까? – IAbstract

+0

또한 'ItemsControl'은 문서 트리에 어디에 있습니까? – IAbstract

+0

ItemsControl.ItemsContainerStyle은 내가 필요로하는 것이었습니다. 나머지 작업을했습니다. 한 무리 주셔서 감사합니다. – Grenter

관련 문제