2008-08-14 16 views
5

リッチツリービュー(ノードの名前変更、子ノードの追加などのコンテキストメニューを持つもの)のUserControlを作成しています。このコントロールを使用して、作成する階層データ構造を管理またはナビゲートすることができます。私は、テンプレートを使用して、私のUserControlに続いてWPFの変数バインディング

interface ITreeItem 
{ 
    string Header { get; set; } 
    IEnumerable Children { get; } 
} 

:私は現在、それは次のインターフェイスを(インターフェイスが実際に実装する必要はありません、しかし、これらのメンバーの存在のみが必要とされる)を実装し、任意のデータ構造のために働いてきましたデータ構造への私のツリーをバインドするために、そのような:私がやりたい何

<TextBlock x:Name="HeaderTextBlock" Text="{Binding Path=Header}" /> 

は、異なるデータ構造の範囲に適応することができ、私のRichTreeViewにこれらのメンバーのそれぞれの名前を定義しています、そうですね:

class MyItem 
{ 
    string Name { get; set; } 
    ObservableCollection<MyItem> Items; 
} 

<uc:RichTreeView ItemSource={Binding Source={StaticResource MyItemsProvider}} 
    HeaderProperty="Name" ChildrenProperty="Items" /> 

そのUserControlのパブリックプロパティとして、UserControl内のバインディングのパスを公開する方法はありますか?この問題を解決する別の方法がありますか?

答えて

2

おそらくこれは役立つかもしれない:

を使用すると、ヘッダー依存関係プロパティにHeaderPropertyプロパティを設定するときに新しいバインディングを作成します。

Headerプロパティは、あなたの通常の日常のDependencyPropertyです:

public string Header 
    { 
     get { return (string)GetValue(HeaderProperty); } 
     set { SetValue(HeaderProperty, value); } 
    } 

    public static readonly DependencyProperty HeaderProperty = 
     DependencyProperty.Register("Header", typeof(string), typeof(ownerclass)); 

とHeaderPropertyのプロパティは次のように機能します。

public static readonly DependencyProperty HeaderPropertyProperty = 
     DependencyProperty.Register("HeaderProperty", typeof(string), typeof(ownerclass), new PropertyMetadata(OnHeaderPropertyChanged)); 

    public string HeaderProperty   
    { 
     get { return (string)GetValue(HeaderPropertyProperty); } 
     set { SetValue(HeaderPropertyProperty, value); } 
    } 

    public static void OnHeaderPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     if (args.NewValue != null) 
     { 
      ownerclass c = (ownerclass) obj; 

      Binding b = new Binding(); 
      b.Path = new PropertyPath(args.NewValue.ToString()); 
      c.SetBinding(ownerclass.HeaderProperty, b); 
     } 
    } 

HeaderPropertyは通常の毎日のDependencyPropertyで、HeaderPropertyが変更されるとすぐに呼び出されるメソッドがあります。それが変更されると、ヘッダーにバインディングが作成され、HeaderPropertyで設定したパスにバインドされます。 :)

関連する問題