Associazioni di variabili in WPF
-
08-06-2019 - |
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?
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.:)