none
[WPF] DataTemplateでデータ自身にバインディング RRS feed

  • 質問

  • こんにちは。いつもお世話になります。

    WPFのItemControlで、ItemTemplateを作成しています。

    とりあえずItemTemplateの部分のみ掲載します。

    <DataTemplate DataType="Point" > <DataTemplate.Resources> <Style TargetType="Ellipse"> <Setter Property="g:PlotPanel.Point" Value="{Binding ???}"/> </Style> </DataTemplate.Resources> <Ellipse/> </DataTemplate>

    Pointオブジェクト用のテンプレートです(表現が間違っていたらごめんなさい)。
    Template内で添付プロパティをPoint自体にバインドしたいと思いますが、
    ???の部分になんと書けば良いのかわかりません。

    Point.Xをバインドするのであれば、「{Binding X}」とすれば良いですし、
    「{Binding}」と書けば、Ellipseにバインドされてしまいます。

    簡単なこととは思いますが、どうにもわからなくなってしまいました。
    どなたかご教授願えませんでしょうか


    2012年12月5日 7:48

回答

  • まず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でセットした値が格納されていました。

    以上、参考になれば幸いです。

    • 回答の候補に設定 佐伯玲 2012年12月7日 5:05
    • 回答としてマーク 佐伯玲 2012年12月7日 8:09
    2012年12月5日 8:29

すべての返信

  • まず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でセットした値が格納されていました。

    以上、参考になれば幸いです。

    • 回答の候補に設定 佐伯玲 2012年12月7日 5:05
    • 回答としてマーク 佐伯玲 2012年12月7日 8:09
    2012年12月5日 8:29
  • 返信ありがとうございます。

    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>

    -> 完全解決!ありがとうございました!!!

    2012年12月7日 6:35