2008-08-14 7 views
5

Je crée un UserControl pour un TreeView riche (avec des menus contextuels pour renommer des nœuds, ajouter des nœuds enfants, etc.). Je veux être en mesure d'utiliser ce contrôle pour gérer ou naviguer dans les structures de données hiérarchiques que je vais créer. J'ai actuellement il travaille pour une structure de données qui implémente l'interface suivante (cependant, n'a pas besoin d'être effectivement mis en œuvre l'interface, seule la présence de ces membres est nécessaire):Liaisons de variables dans WPF

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

Puis dans mon UserControl, j'utiliser des modèles pour lier mon arbre à la structure de données, comme suit:

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

ce que je voudrais faire est de définir le nom de chacun de ces membres dans mon RichTreeView, ce qui lui permet de s'adapter à une gamme de structures de données différentes, comme suit:

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

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

Existe-t-il un moyen d'exposer le chemin d'une liaison à l'intérieur d'un UserControl en tant que propriété publique de ce UserControl? Y a-t-il un autre moyen de résoudre ce problème?

Répondre

2

Peut-être que cela pourrait aider:

Créer une nouvelle liaison lorsque vous définissez la propriété HeaderProperty sur la propriété de dépendance en-tête:

propriété d'en-tête est votre DependencyProperty normale de tous les jours:

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

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

et la propriété de votre HeaderProperty fonctionne comme suit:

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 est votre DependencyProperty de tous les jours, avec une méthode qui est invoquée dès que HeaderProperty change. Ainsi, lorsqu'il change, il crée une liaison sur l'en-tête qui se lie au chemin que vous avez défini dans HeaderProperty. :)

Questions connexes