我有一个包含两个ComboBox的表单。其中一个正在填充来自ViewModel中集合的对象。当我在这个ComboBox中选择一个值时,它应该填充第二个ComboBox。
我想知道的是最好的方法是填充第二个ComboBox。我认为在ViewModel中使用第一个ComboBox的选定值的细节还有另一个集合可能有点浪费。我认为最好的方法可能是使用所选值命中数据库,收集相应的详细信息,然后将其发回。我认为这将如何工作是让细节ComboBox与'master'ComboBox绑定,以便它可以获得选定的值。然后理想情况下,细节ComboBox会以某种方式从数据库中获取值。
问题是我只是不知道如何使用MVVM实现这一点,任何帮助都将不胜感激!
答案 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();
}