ObservableCollection événement PropertyChanged
OK, donc je veux à la sous-classe ObservableCollection
pour ajouter une propriété à elle. Malheureusement, le PropertyChanged
événement est protégé. Fondamentalement, je veux à la sous-classe d'avoir un SelectedItem
que je peux lier à des listes dans mon application WPF, MVVM.
Voici le squelette de ma classe:
public class SelectableList<T> : ObservableCollection<T>
{
public T SelectedItem {get;set;}
}
Mais je ne peux pas faire ce qui suit:
SelectableList<int> intList = new SelectableList<int>();
intList.PropertyChanged += new PropertyChangedEventHandler(intList_Changed);
en raison de restrictions d'accès. Cela m'amène à poser une question plus profonde. Comment se fait l'INTERFACE utilisateur peut être averti de PropertyChanged
événements(par exemple, propriété Count) et je ne peux pas le faire dans le code-behind?
Ma tête tourne, quelqu'un peut-il svp m'éclairer?
OriginalL'auteur Jose | 2009-06-16
Vous devez vous connecter pour publier un commentaire.
ObservableCollection implémente INotifyPropertyChanged explicitement, ce qui signifie que vous devez lancer l'instance de l'interface avant de pouvoir accéder à l'interface des méthodes, propriétés et événements. Pourquoi c'est fait, je ne sais pas. Le La liaison de balisage extension ne sait pas ObservableCollections ou de tout autre type. Il vérifie les types de voir si la mise en œuvre ou de prolonger des interfaces spécifiques/les classes de base (INPC, INCC, DependencyObject, etc) et donc ne se soucient pas si l'interface est implémentée de manière explicite.
lol, j'ai répondu 1 année, 9 mois, il y a 21 jours. Ya pense que vous auriez un avis. (btw, je n'ai pas de soins, il n'a pas d'importance, la réponse à l'écart--vous avez de bonnes infos là).
OriginalL'auteur Will
ObservableCollection (int .NET 3.5) apparaît à mettre en œuvre l'événement PropertyChanged dans un c'est une façon intéressante.
Cela signifie que le protégé PropertyChanged événement est probablement destinée à être utilisée uniquement pour la mise en œuvre interne. Les autres INotifyPropertyChanged.PropertyChanged événement est le même qui répond à la mise en œuvre de la INotifyPropertyChanged interface en tant que interface explicite. Étrangement je ne vois pas de place au sein de l'ObservableCollection où la INotifyPropertyChanged.PropertyChanged est en fait augmenté. Ce pourrait être le signal que c'était un bug .NET 3.5 bien que je n'ai pas testé pour confirmer si par exemple une propriété changé événement est déclenché pour le Comte lorsqu'un élément est ajouté à une collection, mais cela semble être la façon dont il est censé travailler.
Dans le .NET 4.0 mise en œuvre, il apparaît que la INotifyPropertyChanged.PropertyChanged événement à la place des crochets à la même délégué privé utilisé par les protégés PropertyChanged événement qui peut avoir été d'une correction de bug. Il est également possible c'est juste en raison de la les différences dans la façon dont l'auto événement implémentations sont manipulés .NET 4.0.
Correction: j'ai vérifié que le INotifyPropertyChanged.PropertyChanged événement est déclenché par ObservableCollection donc les hypothèses que j'ai faite ci-dessus sur la base des résultats de l'utilisation de Réflecteur à regarder l'ObservableCollection mise en œuvre doit être inexacte. Ma conjecture est que le réflecteur est en train de faire quelque chose d'étrange bug je n'ai aucune preuve de ça pour l'instant.
Donc pour obtenir votre exemple de travail que vous auriez besoin d'écrire pour ce travail serait ressembler à l'exemple ci-dessous juste comme l'a démontré dans sa réponse.
Intéressant de droite? À l'aide des interfaces explicites est principalement utilisé pour éviter les inévitables collisions de membres requis pour une interface donnée, mais ils peuvent être utilisés dans un sens cacher l'existence d'un membre.
Si vous souhaitez augmenter le changement de propriété d'événements pour vos propres propriétés personnalisées que vous introduisez dans votre sous-classe de regarder dans le remplacement et/ou en appelant le protégé OnPropertyChanged méthode qui ObservableCollection met également en œuvre. Cette technique est une norme adoptée et permet à les sous-classes de déclencher des événements ou gérer les événements sans avoir accès à l'événement sous-jacent délégué. Il est généralement préférable d'utiliser cette technique en procédant de la sorte, au lieu d'avoir une sous-classe de crochet gestionnaires d'événements de sa propre base de classes d'événements. Pour plus d'exemples de regarder comment les événements dans différents contrôles sont mis en œuvre dans les WinForms et WPF.
OriginalL'auteur jpierson
J'ai essayé d'ajouter une nouvelle propriété dans
Je n'ai pas vraiment d'avis que PropertyChanged est défini comme protégé. Enfin déménagé Val propriété ViewModel.
OriginalL'auteur Somnath
L'INTERFACE utilisateur peut être averti. C'est une restriction JUSTE avec ObservableCollection, qui définit l'événement PropertyChanged protégées.
FWIW, je pense que vous feriez mieux de laisser ObservableCollection seul et simplement l'ajout d'une autre propriété à votre VM.
À propos de l'ajout d'une autre propriété, au lieu de sous-classement ObservableCollection. Je suis d'accord qu'il est probablement plus à l'approche simpliste et si vous avez besoin de re-essai d'utilisation de la mini-ViewModel motif au lieu de changer ObservableCollection. Je suis allé en bas de la route de la création d'un SelectableCollection classe qui n'est juste que l'OP est d'essayer et je peux dire que c'énormément simplifié de la liaison des situations que je ne suis pas sûr de la façon de faire autrement, mais j'ai modifier quelques autres endroits dans mon code récemment éloigner de ce SelectableCollection car c'est plus facile à faire une extension de ce Dernier.
OriginalL'auteur micahtan