2008-08-14 15 views
5

Ich erstelle ein UserControl für ein reichhaltiges TreeView (eines mit Kontextmenüs zum Umbenennen von Knoten, Hinzufügen von untergeordneten Knoten usw.). Ich möchte in der Lage sein, dieses Steuerelement zu verwenden, um hierarchische Datenstrukturen zu verwalten oder zu navigieren, die ich erstellen werde. Im Moment habe ich es für jede Datenstruktur arbeiten, die die folgende Schnittstelle implementiert (die Schnittstelle nicht tatsächlich umgesetzt werden müssen, jedoch nur das Vorhandensein dieser Mitglieder erforderlich ist):Variablenbindungen in WPF

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

Da ist in meinem Usercontrol, verwende ich Vorlagen mein Baum auf die Datenstruktur zu binden, etwa so:

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

Was ich den Namen jedes dieser Elemente in meinem RichTreeView tun möchte, ist zu definieren, so dass es zu einer Reihe von unterschiedlichen Datenstrukturen anzupassen, so:

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

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

Gibt es eine Möglichkeit, den Pfad einer Bindung in einem UserControl als eine öffentliche Eigenschaft dieses Benutzersteuerelements verfügbar machen? Gibt es einen anderen Weg, dieses Problem zu lösen?

Antwort

2

könnte dies vielleicht helfen:

eine neue Bindung erstellen, wenn Sie die Header Eigenschaft auf der Header-Abhängigkeitseigenschaft festgelegt:

Header-Eigenschaft ist Ihre normale tägliche 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)); 

und die Die Eigenschaft Ihrer HeaderProperty funktioniert wie folgt:

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 ist Ihre alltägliche DependencyProperty mit einer Methode, die aufgerufen wird, sobald sich die HeaderProperty ändert. Wenn es sich ändert, erstellt es eine Bindung für den Header, der an den Pfad gebunden wird, den Sie in der HeaderProperty festlegen. :)