トップ回答者
[WPF] DataTemplateでデータ自身にバインディング

質問
-
こんにちは。いつもお世話になります。
WPFのItemControlで、ItemTemplateを作成しています。
とりあえずItemTemplateの部分のみ掲載します。
Pointオブジェクト用のテンプレートです(表現が間違っていたらごめんなさい)。<DataTemplate DataType="Point" > <DataTemplate.Resources> <Style TargetType="Ellipse"> <Setter Property="g:PlotPanel.Point" Value="{Binding ???}"/> </Style> </DataTemplate.Resources> <Ellipse/> </DataTemplate>
Template内で添付プロパティをPoint自体にバインドしたいと思いますが、
???の部分になんと書けば良いのかわかりません。
Point.Xをバインドするのであれば、「{Binding X}」とすれば良いですし、
「{Binding}」と書けば、Ellipseにバインドされてしまいます。
簡単なこととは思いますが、どうにもわからなくなってしまいました。
どなたかご教授願えませんでしょうか
回答
-
まずDataTypeの指定方法が間違ってますよ。
DataType = "{x:Type Point}"
のように記述する必要があります。
添付プロパティへのBindingですが、DataTypeを指定している以上DataContextにはPointオブジェクトが格納されますので、単純にValue="{Binding}"でOKです。
一応動作確認したコードを貼っておきます。<DataTemplate DataType="{x:Type Point}" > <!--<DataTemplate DataType="Point" > ←ここが違う--> <DataTemplate.Resources> <Style TargetType="Ellipse"> <Setter Property="g:PlotPanel.Point" Value="{Binding}"/> </Style> </DataTemplate.Resources> <Ellipse /> </DataTemplate>
ContentPresenterにPoint型を格納してSnoopで確認しましたが、EllipseのPlotPanel.PointプロパティにはDataTemplateでセットした値が格納されていました。
以上、参考になれば幸いです。
すべての返信
-
まずDataTypeの指定方法が間違ってますよ。
DataType = "{x:Type Point}"
のように記述する必要があります。
添付プロパティへのBindingですが、DataTypeを指定している以上DataContextにはPointオブジェクトが格納されますので、単純にValue="{Binding}"でOKです。
一応動作確認したコードを貼っておきます。<DataTemplate DataType="{x:Type Point}" > <!--<DataTemplate DataType="Point" > ←ここが違う--> <DataTemplate.Resources> <Style TargetType="Ellipse"> <Setter Property="g:PlotPanel.Point" Value="{Binding}"/> </Style> </DataTemplate.Resources> <Ellipse /> </DataTemplate>
ContentPresenterにPoint型を格納してSnoopで確認しましたが、EllipseのPlotPanel.PointプロパティにはDataTemplateでセットした値が格納されていました。
以上、参考になれば幸いです。
-
返信ありがとうございます。
DataTypeの部分が間違っているとは目からウロコでした。
私の場合、以下のようにして解決しました:
1) みっとさんの指摘通りDataTypeの部分を修正 -> EllipseのDataContextにPointが格納されることを確認
2) g:PlotPanel.Pointは、Panel要素が使用する、レイアウトに関するプロパティなので、Ellipseに添付プロパティを設定できたとしてもレイアウトできないことが判明
-> 添付プロパティ設定部分を、ItemsControl.ItemContainerStyleに移動
<ItemsControl.ItemContainerStyle> <Style TargetType="ContentPresenter"> <Setter Property="g:PlotPanel.Origin" Value="0.5,0.5"/> <Setter Property="g:PlotPanel.Point" Value="{Binding}"/> </Style> </ItemsControl.ItemContainerStyle>
-> 完全解決!ありがとうございました!!!