Quelle est la méthode préférée de réagir à un changement d'élément sélectionné à l'aide du TreeView?
-
29-09-2019 - |
Question
Quelle est la méthode préférée de mise à jour d'autres contrôles lorsqu'un TreeViewItem a été sélectionné?
À l'heure actuelle, j'ai la structure suivante dans mon TreeView
DataStoreType - (DataStoreTypeViewModel)
DataStoreEntry - (DataStoreEntryViewModel)
DataStoreEntry - (DataStoreEntryViewModel)
DataStoreEntry - (DataStoreEntryViewModel)
DataStoreType - (DataStoreTypeViewModel)
DataStoreEntry - (DataStoreEntryViewModel)
DataStoreEntry - (DataStoreEntryViewModel)
DataStoreEntry - (DataStoreEntryViewModel)
Il utilise le modèle MVVM, avec chacun des deux types d'éléments de TreeView peuplés par un particulier Vue-modèle (le DataStoreTypeViewModel
et DataStoreEntryViewModel
).
Lorsque l'utilisateur de l'un des noeuds (soit un DataStoreType
ou DataStoreEntry
) Je dois être en mesure de remplir un contrôle de liste avec des informations basées sur la sélection. Ainsi, la liste
besoins de contrôle pour pouvoir afficher deux séries de données différentes.
J'ai lu un peu RoutedEvents
, mais pas sûr que ce soit la voie à suivre ...
Merci
Kieron
La solution
Si vous prenez l'approche ici puis vous pouvez définir une propriété sur le modèle de vue de l'élément sélectionné. En fonction de la relation entre DataStoreType
et DataStoreEntry
vous pouvez utiliser la même propriété sur le modèle de vue soit stocker la classe de base ou de l'interface.
Dans la propriété, vous pouvez réagir en mettant une collection que le contrôle de liste est liée à ...
VM
public IDataStore SelectedStore
{
get { return _store; }
set
{
_store = value;
RaisePropertyChanged("SelectedStore");
RaisePropertyChanged("ListItems");
}
}
public IEnumerbale<string> ListItems
{
get
{
if(_store == null)
return Enumerable.Empty<string>();
else
return _store.Items;
}
}
XAML
<ListBox ItemsSource="{Binding ListItems}" />
En raison de la RaisePropertyChanged("ListItems");
dans le setter pour l'élément sélectionné dans l'arborescence du ListBox
(en supposant que vous utilisez quelque chose comme ça) mettra à jour avec les nouvelles données.
Dans cette conception, je suis en train de récupérer la liste des articles de la DataStoreTypeViewModel
soit ou DataStoreEntryViewModel
qui est mieux encapsulation si les données varie en fonction du type de modèle de vue. Il suffit de les faire mettre en œuvre une interface comme IDataStore
.
Il suffit de le tordre pour répondre à vos besoins.