MVVM和(动态)从另一个组合框的值填充组合框
我有一个带有两个组合框的窗体。其中一个正在填充来自ViewModel集合的对象。当我在此ComboBox中选择一个值时,它应该填充第二个ComboBox。MVVM和(动态)从另一个组合框的值填充组合框
我想知道什么是最好的方式去填充第二个组合框。我认为在ViewModel中第一个ComboBox的选定值的细节还有另一个集合可能有点浪费。我认为最好的方法可能是用选定的值击中数据库,收集相应的细节,然后将它们发回。我如何认为这将工作是让详细信息ComboBox具有绑定与'主'ComboBox,以便它可以获得选定的值。那么理想情况下,ComboBox的细节会以某种方式从数据库中获取值。
问题是我只是不知道如何用MVVM实现这一点,任何帮助将不胜感激!
一旦所选项目发生变化,只需致电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
}
}
}
在您的ViewModel中创建一个方法,该方法获取第二个组合框的数据并使用代码隐藏中的BindingExpression进行更新。
private void FirstComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
_viewModel.SelectionChange();
BindingExpression bindingExpression = BindingOperations.GetBindingExpression(SecondComboBox, ComboBox.ItemsSourceProperty);
bindingExpression.UpdateTarget();
}
看起来很有趣,但我想真的不把任何东西在我的代码:-) – DerMeister 2011-04-18 17:35:23
后面我现在就想试试这个,但我有几个问题。我在代码中看到,你调用'LoadDetailsList()',但没有传递它,所以它可以确定要获取哪些细节。 2.你究竟是什么意思_一旦选择的项目发生变化,就调用OnPropertyChanged的细节集合。然后'Dictionary'就会像'Dictionary'一样。 –
DerMeister
2011-04-18 16:37:55
我明白了,对不起 - 在'LoadDetailsList'中你使用'_SelectedMasterOption'。我的其他问题仍然存在;-) – DerMeister 2011-04-18 16:48:04
我修改了上面的代码,希望有所帮助。我做到这一点并不是唯一的方式,它只是一种方式。 – Jose 2011-04-18 19:29:45