2011-06-19 4 views
4

私はViewModelにバインドされたUserControlを持っています。 UserControlはアイテムのリスト(クラスオブジェクト)にバインドされています。だから私は、DataGridのRowDetailsテンプレート上のプロパティにさまざまな要素をバインドするときは、私は使用します:wpf:AncestorのFindAncestor

"{Binding RelativeSource={RelativeSource FindAncestor, 
          AncestorType={x:Type UserControl}}, 
       Path=DataContext.SomeProperty}" 

これは問題なく動作します。今私はそれらのDataGridsで他のトップレベルのUserControlsで使用できるUserControlにRowDetailsのものを除外したいと思います。では、このバインディングステートメントが記述されているUserControlの祖先であるUserControlを見つけるにはどうすればよいですか?

毎回異なるため、x:Type宣言に最上位レベルのUserControlの名前を指定することはできません。

答えて

4

これはAncestorLevelで行うことができますが、これは正しいバインド方法であると真剣に疑います。

論理ツリー内の位置に応じて動作するUserControlが用意されています。

これらの2つの中央に他のユーザーコントロールを挿入すると、動作を停止します。

バインドする正しい方法は、コントロールに提供されているデータコンテキストを使用することです。

データの一部が欠落している場合は、そのdatacontextにそれを適応させるよりも、それがその親のdatacontextからデータを読み込むことを意味します。

3

AncestorLevelをご覧ください。

"{Binding RelativeSource={RelativeSource FindAncestor, 
             AncestorType={x:Type UserControl}, 
             AncestorLevel=2}, 
      Path=DataContext.SomeProperty}"