Domanda

Sto creando un UserControl per un ricco TreeView (uno che abbia menu contestuali per rinominare i nodi, aggiungere nodi figlio, ecc.).Voglio essere in grado di utilizzare questo controllo per gestire o navigare in qualsiasi struttura di dati gerarchica che creerò.Attualmente funziona per qualsiasi struttura dati che implementa la seguente interfaccia (non è necessario che l'interfaccia sia effettivamente implementata, tuttavia è richiesta solo la presenza di questi membri):

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

Quindi nel mio UserControl utilizzo i modelli per associare il mio albero alla struttura dei dati, in questo modo:

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

Quello che vorrei fare è definire il nome di ciascuno di questi membri nel mio RichTreeView, permettendogli di adattarsi a una gamma di strutture dati diverse, in questo modo:

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

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

Esiste un modo per esporre il percorso di un'associazione all'interno di un UserControl come proprietà pubblica di tale UserControl?C'è qualche altro modo per risolvere questo problema?

È stato utile?

Soluzione

Forse questo potrebbe aiutare:

Crea una nuova associazione quando imposti la proprietà HeaderProperty sulla proprietà di dipendenza Header:

La proprietà Header è la normale DependencyProperty quotidiana:

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

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

e la proprietà del tuo HeaderProperty funziona come segue:

    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 è la normale DependencyProperty di tutti i giorni, con un metodo che viene richiamato non appena HeaderProperty cambia.Pertanto, quando cambia, crea un'associazione sull'intestazione che si collegherà al percorso impostato in HeaderProperty.:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top