Question

Je crée un UserControl pour un TreeView riche (celui qui comporte des menus contextuels pour renommer les nœuds, ajouter des nœuds enfants, etc.).Je souhaite pouvoir utiliser ce contrôle pour gérer ou parcourir toutes les structures de données hiérarchiques que je vais créer.Je le fais actuellement fonctionner pour toute structure de données qui implémente l'interface suivante (l'interface n'a pas besoin d'être réellement implémentée, cependant, seule la présence de ces membres est requise) :

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

Ensuite, dans mon UserControl, j'utilise des modèles pour lier mon arbre à la structure de données, comme ceci :

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

Ce que j'aimerais faire, c'est définir le nom de chacun de ces membres dans mon RichTreeView, lui permettant de s'adapter à une gamme de structures de données différentes, comme ceci :

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 ?Existe-t-il une autre façon de résoudre ce problème ?

Était-ce utile?

La solution

Peut-être que ceci pourrait aider :

Créez une nouvelle liaison lorsque vous définissez la propriété HeaderProperty sur la propriété de dépendance Header :

La propriété Header est votre DependencyProperty quotidienne normale :

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top