2011-04-18 101 views
3

我有一个带有两个组合框的窗体。其中一个正在填充来自ViewModel集合的对象。当我在此ComboBox中选择一个值时,它应该填充第二个ComboBox。MVVM和(动态)从另一个组合框的值填充组合框

我想知道什么是最好的方式去填充第二个组合框。我认为在ViewModel中第一个ComboBox的选定值的细节还有另一个集合可能有点浪费。我认为最好的方法可能是用选定的值击中数据库,收集相应的细节,然后将它们发回。我如何认为这将工作是让详细信息ComboBox具有绑定与'主'ComboBox,以便它可以获得选定的值。那么理想情况下,ComboBox的细节会以某种方式从数据库中获取值。

问题是我只是不知道如何用MVVM实现这一点,任何帮助将不胜感激!

回答

3

一旦所选项目发生变化,只需致电OnPropertyChanged即可。

您可以预先填充背景字典,其关键字是可能的主要项目,其值是详细列表的列表。

注意下面的工作,你ViewModel必须实现INotifyPropertyChanged

例如

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

后面我现在就想试试这个,但我有几个问题。我在代码中看到,你调用'LoadDetailsList()',但没有传递它,所以它可以确定要获取哪些细节。 2.你究竟是什么意思_一旦选择的项目发生变化,就调用OnPropertyChanged的细节集合。然后'Dictionary'就会像'Dictionary '一样。 – DerMeister 2011-04-18 16:37:55

+0

我明白了,对不起 - 在'LoadDetailsList'中你使用'_SelectedMasterOption'。我的其他问题仍然存在;-) – DerMeister 2011-04-18 16:48:04

+0

我修改了上面的代码,希望有所帮助。我做到这一点并不是唯一的方式,它只是一种方式。 – Jose 2011-04-18 19:29:45

0

在您的ViewModel中创建一个方法,该方法获取第二个组合框的数据并使用代码隐藏中的BindingExpression进行更新。

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

看起来很有趣,但我想真的不把任何东西在我的代码:-) – DerMeister 2011-04-18 17:35:23