2011-08-24 7 views
25

データバインディングを使用してキャンバスに表示する項目のリストがあります。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は、テキストの自動プロパティを持つ単純なクラスで、トップと左は私が項目をデータバインドするとき、彼らはキャンバスに表示されない

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

関連する問題