2010-05-19 2 views
3

J'ai une liste déroulante que j'ai liée à une liste qui existe dans mon modèle de vue. Maintenant, quand un utilisateur fait une sélection dans cette zone de liste déroulante, je veux une deuxième zone de liste déroulante pour mettre à jour son contenu. Par exemple, combobox1 est States et combobox2 ne doit contenir que les Zipcodes de cet état. Par exemple,Mise à jour de la liaison de données WPF comboxbox2 en fonction du changement de sélection dans la zone de liste déroulante avec MVVM

Mais dans mon cas, je n'ai pas de liste prédéfinie avant la main pour combobox2, je dois aller chercher à partir d'un db.

En outre, si nécessaire, je pourrais obtenir toutes les valeurs potentielles pour combobox2 (pour chaque valeur combobox1) avant la main, mais je voudrais éviter cela si je le peux.

Comment puis-je implémenter dans WPF et utiliser MVVM? Je suis relativement nouveau dans tout ce monde wpf \ databinding \ mvvm.

Répondre

2

Quelque chose comme ce qui suit. Notez que le code est considérablement simplifié à titre d'exemple. En réalité, votre ViewModel implémenterait INotifyPropertyChanged et déclencherait des événements PropertyChanged lors de la modification des propriétés.

La clé est le sélecteur de SelectedState. Votre zone de liste déroulante lierait sa propriété SelectedValue à la propriété SelectedState du ViewModel. Lorsque la propriété a été modifiée, la collection ZipCodes est rechargée à laquelle une autre zone de liste déroulante serait liée.

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

Juste quelques conseils peut-être évidentes pour ajouter ... 1. Effacer la collection avant d'ajouter les nouvelles fermetures éclair 2. Je tenterais certainement implémenter un modèle asynchrone, vous ne voulez pas que l'écran se bloque, jusqu'à ce que l'appel revienne. 3. Si vous utilisez une approche asynchrone, vous pouvez désactiver la combinaison Zip jusqu'à ce que l'appel soit rétabli. – Agies

0

Une autre solution. Le modèle approximatif:

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 {...} 
    } 
} 

Et XAML:

<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> 
Questions connexes