2011-04-18 6 views
3

두 개의 콤보 상자가있는 양식이 있습니다. 그 중 하나는 ViewModel의 컬렉션에서 오는 객체로 채워집니다. 이 ComboBox에서 값을 선택하면 두 번째 ComboBox를 채워야합니다.MVVM 및 다른 콤보 상자의 값에서 콤보 상자 채우기 (동적)

제가 알고 싶은 것은 두 번째 ComboBox 작성에 가장 좋은 방법은 무엇인지 알아야합니다. 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

+0

나는 그것을 얻는다, 미안하다 -'LoadDetailsList'에서 당신은'_SelectedMasterOption'을 사용한다. 내 다른 질문은 여전히 ​​의미한다 ;-) – DerMeister

+0

나는 위의 코드를 수정했다. 내가 한 방식은 유일한 방법이 아니며 단지 방법 일뿐입니다. – Jose

0

코드 숨김에서 두 번째 콤보 상자의 데이터를 가져 와서 BindingExpression으로 업데이트하는 ViewModel의 메서드를 만듭니다.

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

흥미로운 보이는,하지만 난 정말 내가 지금이 일을 시도 할 :-) – DerMeister