2010-05-19 6 views
3

내 viewmodel에있는 목록에 바인딩 된 콤보 상자가 있습니다. 이제 사용자가 해당 콤보 상자에서 선택을하면 두 번째 콤보 상자에서 해당 내용을 업데이트해야합니다.WPF 데이터 바인딩 업데이트 combobox1에 따라 combobox1 선택 변경 MVVM

예를 들어 combobox1은 States이고 combobox2는 해당 상태의 우편 번호 만 포함해야합니다.

하지만 제 경우에는 combobox2를 사용하기 전에 미리 정의 된 목록이 없습니다. db에서 가져 오기가 필요합니다.

또한 필요한 경우 combobox2 (각 combobox1 값에 대한)의 모든 잠재적 가치를 얻을 수 있지만 가능한 경우이를 피하고 싶습니다.

WPF 및 MVVM을 어떻게 구현합니까? 나는이 전체 wpf \ databinding \ mvvm 세계에 상당히 익숙하다.

답변

2

다음과 같이됩니다. 예를 들어 코드가 대폭 간소화되었습니다. 실제로, ViewModel은 INotifyPropertyChanged를 구현하고 속성이 수정되면 PropertyChanged 이벤트를 발생시킵니다.

키는 SelectedState의 설정자입니다. ComboBox는 SelectedValue 속성을 ViewModel의 SelectedState 속성에 바인딩합니다. 속성이 변경되면 ZipCodes 컬렉션이 다시로드되어 다른 콤보 상자가 바인딩됩니다.

class MyViewModel { 

    public ObservableCollection<string> States { 
     get; 
     private set; 
    } 

    public ObservableCollection<string> ZipCodes { 
     get; 
     private set; 
    } 

    public string SelectedState { 
     get { return _selectedState; } 
     set { 
      _selectedState = value; 
      LoadZipCodes(_selectedState); 
     } 
    } 

    public string SelectedZipCode { 
     get; 
     set; 
    } 

    void LoadZipCodes(string state) { 
     // repopulate the ZipCodes property 
    } 

} 
+0

그냥 몇 어쩌면 명백한 팁을 추가 ... 1. 지우기 컬렉션 새로운 우편 번호를 추가하기 전에 2. 나는 확실히하려고 할 것입니다 : 대략적인 모델 :

class StateViewModel { public string StateName { get {...} set {...} } public ObservableCollection<ZipCodeViewModel> ZipCodes { get {...} set {...} } } class ZipCodeViewModel { public string ZipCodeName { get {...} set {...} } } class MainViewModel { public ObservableCollection<StateViewModel> States { get {...} set {...} } } 

그리고 XAML 비동기 패턴을 구현하면 호출이 다시 나타날 때까지 화면이 멈추지 않아도됩니다. 3. 비동기 방식을 구현하는 경우 전화가 다시 수신 될 때까지 Zip 콤보를 비활성화 할 수 있습니다. – Agies

0

다른 해결책.

<ComboBox ItemsSource="{Binding Path=States}" IsSynchronizedWithCurrentItem="True"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <Label Content="{Binding Path=StateName}"></Label> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

<ContentControl Content="{Binding Path=States}"> 
    <ContentControl.ContentTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding Path=ZipCodes}"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=ZipCodeName}"></Label> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 
     </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 
관련 문제