2010-11-08 24 views
0

Quelle est la méthode préférée pour mettre à jour d'autres contrôles lorsqu'un TreeViewItem a été sélectionné?Quelle est la méthode préférée pour réagir à un changement d'élément sélectionné à l'aide de TreeView?

Actuellement, 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 une vue modèle spécifique (DataStoreTypeViewModel et DataStoreEntryViewModel).

Lorsque l'utilisateur sélectionne l'un des nœuds (DataStoreType ou DataStoreEntry), je dois pouvoir renseigner un contrôle de liste avec des informations basées sur la sélection. La commande doit donc pouvoir afficher deux ensembles de données différents.

J'ai lu un peu RoutedEvents, mais pas sûr que ce soit la voie à suivre ...

Merci
Kieron

Répondre

0

Si vous prenez l'approche adoptée here 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 en stockant la classe de base ou 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 la setter pour l'élément sélectionné dans l'arborescence le ListBox (en supposant que vous utilisez quelque chose comme ça) mettra à jour avec les nouvelles données. Dans cette conception, je récupère la liste des éléments de DataStoreTypeViewModel ou DataStoreEntryViewModel qui est meilleure encapsulation si les données varient en fonction du type de modèle de vue. Il suffit de les implémenter une interface comme IDataStore.

Ajustez-le simplement en fonction de vos besoins.