MVVM和(动态)从另一个组合框的值填充组合框

3
我有一个带有两个ComboBox的表单。其中一个ComboBox中填充了来自ViewModel中集合的对象。当我在此ComboBox中选择一个值时,它应该填充第二个ComboBox。
我想知道的是如何最好地填充第二个ComboBox。我认为,在ViewModel中拥有另一个包含第一个ComboBox所选值详细信息的集合可能有点浪费。我认为最好的方法可能是使用所选值向数据库发出请求,收集相应的详细信息,然后将它们发送回来。我认为这将通过让详细信息ComboBox与“主”ComboBox进行绑定以获取所选值。然后,理想情况下,详细信息ComboBox将从数据库中获取值。
问题是我不知道如何使用MVVM实现这一点,任何帮助都将不胜感激!
2个回答

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

我想现在就尝试一下,但我有几个问题。我在代码中看到你调用了LoadDetailsList(),但是没有传递任何内容,以便它确定要获取哪些详细信息。2.您所说的“只需在选择的项目更改时调用详细信息集合的OnPropertyChanged即可”是什么意思?然后,Dictionary将类似于Dictionary<MasterOption,DetailOption> - DerMeister
我明白了,很抱歉 - 在 LoadDetailsList 中您使用了 _SelectedMasterOption。不过我的另一个问题仍然存在;-) - DerMeister
我修改了上面的代码,希望能帮到你。我所做的方式并不是唯一的方式,只是其中的一种。 - Jose

0
在您的ViewModel中创建一个方法,用于获取第二个组合框的数据,并在您的代码后台使用BindingExpression进行更新。
private void FirstComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {            
        _viewModel.SelectionChange();
        BindingExpression bindingExpression = BindingOperations.GetBindingExpression(SecondComboBox, ComboBox.ItemsSourceProperty);
        bindingExpression.UpdateTarget();
    }

看起来很有趣,但我真的不想在我的代码后面放任何东西 :-) - DerMeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接