2011-04-18 124 views
3

我有一個帶有兩個組合框的窗體。其中一個正在填充來自ViewModel集合的對象。當我在此ComboBox中選擇一個值時,它應該填充第二個ComboBox。MVVM和(動態)從另一個組合框的值填充組合框

我想知道什麼是最好的方式去填充第二個組合框。我認爲在ViewModel中第一個ComboBox的選定值的細節還有另一個集合可能有點浪費。我認爲最好的方法可能是用選定的值擊中數據庫,收集相應的細節,然後將它們發回。我如何認爲這將工作是讓詳細信息ComboBox具有綁定與'主'ComboBox,以便它可以獲得選定的值。那麼理想情況下,ComboBox的細節會以某種方式從數據庫中獲取值。

問題是我只是不知道如何用MVVM實現這一點,任何幫助將不勝感激!

回答

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

後面我現在就想試試這個,但我有幾個問題。我在代碼中看到,你調用'LoadDetailsList()',但沒有傳遞它,所以它可以確定要獲取哪些細節。 2.你究竟是什麼意思_一旦選擇的項目發生變化,就調用OnPropertyChanged的細節集合。然後'Dictionary'就會像'Dictionary '一樣。 – DerMeister 2011-04-18 16:37:55

+0

我明白了,對不起 - 在'LoadDetailsList'中你使用'_SelectedMasterOption'。我的其他問題仍然存在;-) – DerMeister 2011-04-18 16:48:04

+0

我修改了上面的代碼,希望有所幫助。我做到這一點並不是唯一的方式,它只是一種方式。 – Jose 2011-04-18 19:29:45

0

在您的ViewModel中創建一個方法,該方法獲取第二個組合框的數據並使用代碼隱藏中的BindingExpression進行更新。

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

看起來很有趣,但我想真的不把任何東西在我的代碼:-) – DerMeister 2011-04-18 17:35:23