【问题标题】:MVVM and (dynamically) filling a combobox from the value of another comboboxMVVM 和(动态)从另一个组合框的值填充组合框
【发布时间】:2011-04-18 12:45:27
【问题描述】:

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

我想知道填充第二个 ComboBox 的最佳方法是什么。我认为另一个集合包含 ViewModel 中第一个 ComboBox 的选定值的详细信息可能有点浪费。我认为最好的方法可能是用选定的值访问数据库,收集相应的详细信息,然后将它们发回。我认为这样做的方法是让详细信息 ComboBox 与“主”ComboBox 绑定,以便它可以获取选定的值。那么理想情况下,详细信息 ComboBox 会以某种方式从数据库中获取值。

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

【问题讨论】:

    标签: wpf binding


    【解决方案1】:

    一旦选定的项目发生变化,只需调用详细信息集合的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&lt;MasterOption, DetailOption&gt;
    • 我明白了,对不起 - 在 LoadDetailsList 中,您使用 _SelectedMasterOption。我的另一个问题仍然存在;-)
    • 我修改了上面的代码,希望有帮助。我这样做的方式不是唯一的方式,它只是一种方式。
    【解决方案2】:

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

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

    【讨论】:

    • 看起来很有趣,但我真的不想在我的代码后面放任何东西:-)
    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多