2011-03-20 4 views
6

J'ai reçu un exemple d'application mvvm. L'interface utilisateur a une zone de texte, un bouton et une liste déroulante. quand j'entre quelque chose dans la zone de texte et que j'appuie sur le bouton, le texte que je saisis est ajouté à une collection observable. Le Combobox est lié à cette collection. Comment puis-je obtenir la liste déroulante pour afficher automatiquement la chaîne nouvellement ajoutée?WPF - Contenu de la liste déroulante de rafraîchissement automatique

Répondre

5

Si je comprends bien, vous voulez ajouter un élément et le sélectionner. Voici un exemple de comment cela peut être fait en utilisant ViewModel et les liaisons.

Xaml:

<StackPanel> 
    <TextBox Text="{Binding ItemToAdd}"/> 
    <ComboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" /> 
    <Button Content="Add" Click="Button_Click"/> 
</StackPanel> 

ViewModel:

public class MainViewModel:INotifyPropertyChanged 
{ 
    public ObservableCollection<string> Items { get; set; } 

    public string ItemToAdd { get; set; } 

    private string selectedItem; 

    public string SelectedItem 
    { 
     get { return selectedItem; } 
     set 
     { 
      selectedItem = value; 
      OnPropertyChanged("SelectedItem"); 
     } 
    } 

    public void AddNewItem() 
    { 
     this.Items.Add(this.ItemToAdd); 
     this.SelectedItem = this.ItemToAdd; 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Le MainViewModel a 3 propriétés (une pour le TextBox et deux autres pour la ComboBox) et la méthode AddNewItem sans paramètres.

La méthode peut être déclenché à partir d'une commande, mais il n'y a pas de classe standard pour les commandes, donc je vais l'appeler à partir du code-behind:

((MainViewModel)this.DataContext).AddNewItem(); 

Vous devez donc définir explicitement un élément ajouté comme sélectionné après l'avoir ajouté à une collection.

Parce que la méthode OnItemsChanged de la classe ComboBox est protégée et ne peut pas être utilisée.

3

Si la zone de liste déroulante est liée à une ObservableCollection, la zone de liste déroulante sera mise à jour dès que la collection est modifiée. C'est l'avantage d'utiliser un ObservableCollection - vous n'avez pas besoin de faire de codage supplémentaire pour mettre à jour l'interface utilisateur.

Si ce n'est pas le comportement que vous voyez, vous pouvez peut-être poster du code/xaml.

Questions connexes