时间:2011-04-18 12:45:27

标签: wpf binding

我有一个包含两个ComboBox的表单。其中一个正在填充来自ViewModel中集合的对象。当我在这个ComboBox中选择一个值时,它应该填充第二个ComboBox。

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

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

2 个答案:

答案 0 :(得分:3)

一旦所选项目发生变化,只需调用详细信息集合的OnPropertyChanged即可。

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

请注意,以下工作原则ViewModel必须实施INotifyPropertyChanged

e.g。

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
    }
  }
}

答案 1 :(得分:0)

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

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