2011-04-18 5 views
3

J'ai un formulaire avec deux ComboBox. L'un d'eux est rempli d'objets provenant d'une collection dans le ViewModel. Lorsque je sélectionne une valeur dans ce ComboBox, il doit alors remplir le deuxième ComboBox.MVVM et (dynamiquement) remplir une liste déroulante à partir de la valeur d'une autre liste déroulante

Ce que je veux savoir, c'est quel est le meilleur moyen de remplir le second ComboBox. Je pense qu'avoir une autre collection avec les détails de la valeur sélectionnée du premier ComboBox dans le ViewModel pourrait être un peu inutile. Je pense que le meilleur moyen pourrait être de frapper la base de données avec la valeur sélectionnée, en collectant les détails correspondants, puis de les renvoyer. Comment je pense cela fonctionnerait est d'avoir les détails ComboBox ont une liaison avec le «maître» ComboBox afin qu'il puisse obtenir la valeur sélectionnée. Alors idéalement, les détails ComboBox seraient alors en quelque sorte obtenir les valeurs de la base de données.

Le problème est que je ne sais pas comment implémenter cela avec MVVM, et toute aide serait appréciée!

Répondre

3

Appelez simplement OnPropertyChanged une fois que l'élément sélectionné a été modifié.

Vous pouvez pré-remplir un dictionnaire d'arrière-plan dont la clé est les éléments principaux possibles et dont les valeurs sont une liste de liste détaillée.

Note pour le ci-dessous pour vous travailler ViewModel devez implémenter INotifyPropertyChanged

par exemple

public class MyViewModel : INotifyPropertyChanged 
{ 
    public IEnumerable<MasterOption> MasterList {get;set;} 
    public IEnumerable<DetailOption> DetailList {get;set;} 
    Dictionary<MasterOption,List<DetailOption>> DetailLookup; 
    MasterOption _SelectedMasterOption; 
    public MasterOption SelectedMasterOption 
    { 
    get { return _SelectedMasterOption;} 
    set 
    { 
     _SelectedMasterOption = value; 
     LoadDetailsList(); 
     OnPropertyChanged("SelectedMasterOption"); 
    } 

    void LoadDetailsList() 
    { 
    InitDictionary(); 
    if (DetailLookup.ContainsKey(SelectedMasterOption)) 
     DetailList = DetailLookup[SelectedMasterOption]; 
    else 
     DetailList = null; 

    OnPropertyChanged("DetailList"); 
    } 
    void InitDictionary() 
    { 
    if (DetailLookup == null) 
    { 
     //Grab fill the lookup dictionary with information 
    } 
    } 
} 
+0

Je veux essayer celui-ci en ce moment, mais j'ai quelques questions. Je vois dans le code que vous appelez 'LoadDetailsList()', mais sans lui remettre quelque chose afin qu'il puisse déterminer les détails à saisir. 2. Que voulez-vous dire exactement avec _Just appel OnPropertyChanged de la collection de détails une fois que l'élément sélectionné change._? Et le 'Dictionary' sera alors quelque chose comme' Dictionary '. – DerMeister

+0

Je comprends, je suis désolé - Dans le 'LoadDetailsList' vous utilisez le' _SelectedMasterOption'. Mon autre question se tient toujours cependant ;-) – DerMeister

+0

J'ai modifié le code ci-dessus, j'espère que cela aide. La façon dont je l'ai fait n'est pas le seul moyen, c'est juste un moyen. – Jose

0

Créez une méthode dans votre ViewModel qui récupère les données pour la deuxième liste déroulante et mettez à jour avec BindingExpression dans votre codebehind.

private void FirstComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    {    
     _viewModel.SelectionChange(); 
     BindingExpression bindingExpression = BindingOperations.GetBindingExpression(SecondComboBox, ComboBox.ItemsSourceProperty); 
     bindingExpression.UpdateTarget(); 
    } 
+0

semble intéressant, mais je suis en train de vraiment pas mettre quelque chose dans mon code derrière :-) – DerMeister

Questions connexes