2009-12-29 7 views
0

Je me suis battue pour obtenir la liaison de données pour travailler dans WPF pendant un peu plus d'une semaine. J'ai obtenu une aide précieuse en ce qui concerne le DataContext, et j'ai eu la connexion de données pour travailler via DependencyProperties. Pendant que j'apprenais sur la liaison de données, je suis tombé sur de nombreuses discussions à propos du INotifyPropertyChanged et de la façon dont il est meilleur que les PDD de plusieurs façons. Je me suis dit que j'essaierais et que je l'essayerais. J'utilise la classe ViewModel de base de Josh Smith et mon ViewModel en est dérivé. Cependant, j'ai un peu de mal à obtenir la liaison de données au travail, et j'espère que quelqu'un ici peut me dire où je vais mal. Dans ma classe ViewModel, j'ai un code ObservableCollection<string>. Dans mon interface graphique, j'ai un combobox qui est lié à cette OC, à savoirLiaison de données avec INotifyPropertyChanged au lieu de DependencyProperties

<ComboBox ItemsSource="{Binding PluginNames}" /> 

DataContext du GUI est réglé sur le ViewModel, à savoir

private ViewModel _vm; 

public GUI() 
{ 
    InitializeComponent(); 
    _vm = new ViewModel(); 
    this.DataContext = _vm; 
} 

et le ViewModel a le OC nommé "PluginNames" :

public class ViewModel 
{ 
    public ObservableCollection<string> PluginNames; // this gets instantiated and added to elsewhere 
} 

Lorsque l'interface graphique est chargée, une méthode est appelée instanciant le CO et ajoute les noms de plug-in à lui. Une fois le CO modifié, j'appelle le RaisePropertyChanged("PluginNames"). Je m'attendais à ce que le modèle de liaison de données WPF soit conscient de INotifyPropertyChanged, que c'est tout ce que je devais faire et qu'il fonctionnerait "magiquement" et mettrait à jour les éléments combobox avec les plugins chargés ... mais ce n'est pas le cas.

Quelqu'un peut-il s'il vous plaît signaler ce que j'ai mal fait ici? Merci! MISE À JOUR: Je ne sais pas pourquoi, mais maintenant, au lieu de ne pas effectuer de mise à jour apparente, je ne trouve pas la propriété du tout. Je pense que je suis vraiment stupide et qu'il manque une étape importante quelque part.

Répondre

4

Il semble que vous ayez exposé un champ et non une propriété. Fixations fonctionne pour les propriétés seulement ... Changer à:

public class ViewModel 
{ 
    public ObservableCollection<string> PluginNames {get; private set;} 
} 
+1

N'utilisez pas les propriétés automatiques: elles n'élèvent pas l'événement PropertyChanged. – itowlson

+0

tout à fait raison. argh! Je vais aller mieux à ce genre de choses finalement. :) – Dave

+0

Est-ce que le bon SO étiquette ici pour accepter la réponse la plus ancienne correcte? Je suppose que oui. – Dave

6

Lorsque vous travaillez avec INotifyPropertyChanged, il y a deux choses:

  1. Vous aurez besoin d'utiliser les propriétés, pas de champs
  2. Vous devez toujours déclencher l'événement modifié de propriété lorsque vous définissez les propriétés hte.

Vous aurez envie de retravailler cette sorte qu'il ressemble plus:

private ObservableCollection<string> pluginNames; 
public ObservableCollection<string> PluginNames 
{ 
    get { return pluginNames; } 
    set { 
     this.pluginNames = value; 
     RaisePropertyChanged("PluginNames"); // This should raise the PropertyChanged event - use whatever your VM class does for this 
    } 
} 

Cela devrait faire tout à repeupler.

+2

En fait, il n'y a probablement aucune raison d'avoir un setter sur la propriété, puisqu'il s'agit d'une collection (et d'une collection observable). –

+0

oh jeez. C'est vrai! Je vous remercie. Désolé pour ma stupidité. – Dave

+1

Ouais - mais il a mentionné à dessein qu'il était en train de mettre ça à jour, donc j'ai inclus ça. –

Questions connexes