2015-01-21 2 views
0

저는 MVVM을 처음 사용하고 있으며 콤보 상자가 두 개인 모델에 검색보기를 쓰고 있습니다. 내 첫 번째 콤보 상자 선택에 따라 두 번째 콤보 상자에 다양한 목록을 표시해야합니다. 콤보 상자 1 이것은 내가하고 싶은 무엇MvvM 모델의 속성 변경 이벤트에서 구동되는 콤보 상자 목록 표시

{ 
     public string SetCriteria { get; set; } 

    }  
    public class SearchCriteriaStaicData 
    { 
     public static List<SearchCriteriaList> MyStaicCriteriaList 
     { 
      get 
      { 
       return new List<SearchCriteriaList>() 
       { 
        new SearchCriteriaList {SetCriteria = "Date Range"}, 
        new SearchCriteriaList {SetCriteria = "Gateway"}, 
       }; 
      } 
     } 
    } 

뒤에 내 코드에서 데이터를 표시이

<ComboBox Margin="103,6,0,24" Name="cmbCriteria" DisplayMemberPath="SetCriteria" Grid.Column="1"> 
         <ComboBox.ItemsSource> 
          <CompositeCollection> 
           <CollectionContainer Collection="{Binding Source={x:Static model:SearchCriteriaStaicData.MyStaicCriteriaList}}" /> 
          </CompositeCollection> 
         </ComboBox.ItemsSource> 
        </ComboBox> 

처럼 보이는 선택 콤보 상자 값이 날짜 범위는 다음 내 두 번째 콤보 상자가 표시됩니다 경우입니다 게이트웨이 내 SearchDateOperatorStaticData 클래스

public class SearchDateOperatorStaticData 
    { 
     public static List<SearchOperatorLists> DateStaicOperatorList 
     { 
      get 
      { 
       return new List<SearchOperatorLists>() 
       { 
        new SearchOperatorLists {OperatorName = "Today"}, 
        new SearchOperatorLists {OperatorName = "Between"}, 
        new SearchOperatorLists {OperatorName = "Last Month"}, 
       }; 
      } 
     }  
    } 

을 또는 경우 목록이 첫 번째 콤보 상자에서 선택되는 두 번째 콤보 상자는 t에서 목록을 표시합니다 당신이 MVVM 태그를 추가하기 때문에 그가

public class SearchGatewayOperatorStaticData 
    { 
     public static List<SearchOperatorLists> GatewayStaicOperatorList 
     { 
      get 
      { 
       return new List<SearchOperatorLists>() 
       { 
        new SearchOperatorLists {OperatorName = "Email"}, 
        new SearchOperatorLists {OperatorName = "RDP"}, 
        new SearchOperatorLists {OperatorName = "Web"}, 
        new SearchOperatorLists {OperatorName = "Other"}, 
       }; 
      } 
     } 
    } 

답변

0

을 SearchGatewayOperatorStaticData, 난 당신이 MVVM 패턴을 따라보기 모델에 논리를 이동하는 것이 좋습니다. 뷰 모델은 콤보 상자의 현재 선택 항목에 바인딩 속성 SelectedCriteriaList을 포함,

class ViewModel : INotifyPropertyChanged 
{ 
    private readonly List<SearchOperatorLists> dateOperatorList = new List<SearchOperatorLists> 
    { 
     new SearchOperatorLists {OperatorName = "Today"}, 
     new SearchOperatorLists {OperatorName = "Between"}, 
     new SearchOperatorLists {OperatorName = "Last Month"} 
    }; 

    private readonly List<SearchOperatorLists> gatewayOperatorList = new List<SearchOperatorLists> 
    { 
     new SearchOperatorLists {OperatorName = "Email"}, 
     new SearchOperatorLists {OperatorName = "RDP"}, 
     new SearchOperatorLists {OperatorName = "Web"}, 
     new SearchOperatorLists {OperatorName = "Other"} 
    }; 

    private SearchCriteriaList selectedCriteriaList; 

    public ViewModel() 
    { 
     this.CriteriaList = new ObservableCollection<SearchCriteriaList> 
     { 
      new SearchCriteriaList {SetCriteria = "Date Range"}, 
      new SearchCriteriaList {SetCriteria = "Gateway"} 
     }; 

     this.OperatorList = new ObservableCollection<SearchOperatorLists>(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public ObservableCollection<SearchCriteriaList> CriteriaList { get; private set; } 

    public SearchCriteriaList SelectedCriteriaList 
    { 
     get { return this.selectedCriteriaList; } 
     set 
     { 
      if (value != this.selectedCriteriaList) 
      { 
       this.selectedCriteriaList = value; 
       this.OnPropertyChanged("SelectedCriteriaList"); 
       this.UpdateOperators(); 
      } 
     } 
    } 

    public ObservableCollection<SearchOperatorLists> OperatorList { get; private set; } 

    private void UpdateOperators() 
    { 
     this.OperatorList.Clear(); 

     if (this.SelectedCriteriaList == this.CriteriaList[0]) 
     { 
      foreach (SearchOperatorLists item in this.dateOperatorList) 
      { 
       this.OperatorList.Add(item); 
      } 
     } 
     else if (this.SelectedCriteriaList == this.CriteriaList[1]) 
     { 
      foreach (SearchOperatorLists item in this.gatewayOperatorList) 
      { 
       this.OperatorList.Add(item); 
      } 
     } 
    } 

    private void OnPropertyChanged(string property) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 
} 

참고 :

은 당신의 컬렉션을 포함하는 뷰 모델을 만듭니다. 이 값이 변경되면 (예 : 콤보 상자의 사용자 선택을 통해) 뷰 모델이 작업을 수행하고 UpdateOperators() 메소드를 호출합니다. 이 메서드는 OperatorList 컬렉션을 업데이트하여 해당 항목이 선택한 조건에 일치하도록합니다.

다음 바인딩을 사용해야로보기 :

<ComboBox 
    DisplayMemberPath="SetCriteria" 
    ItemsSource="{Binding CriteriaList}" 
    SelectedItem="{Binding SelectedCriteriaList, Mode=TwoWay}"/> 

<ComboBox 
    DisplayMemberPath="OperatorName" 
    ItemsSource="{Binding OperatorList}"/> 
관련 문제