Frage

OK, so möchte ich ObservableCollection Unterklasse eine Eigenschaft, um es hinzuzufügen. Leider ist das PropertyChanged Ereignis geschützt. Grundsätzlich mag ich es zu Unterklasse eine SelectedItem zu haben, die ich für die Listen in meiner MVVM WPF-Anwendung binden kann.

Hier ist das Skelett meiner Klasse:

public class SelectableList<T> : ObservableCollection<T>
{
    public T SelectedItem {get;set;}
}

Aber ich kann nicht wie folgt vor:

SelectableList<int> intList = new SelectableList<int>();
intList.PropertyChanged += new PropertyChangedEventHandler(intList_Changed);

wegen der Zugangsbeschränkungen. Dies bewirkt, dass mir eine tiefere Frage zu stellen. Wie die Benutzeroberfläche kommt von PropertyChanged Ereignissen benachrichtigt, (z. Count-Eigenschaft), und ich kann es nicht in Code-behind?

Mein Kopf dreht, kann mir bitte jemand aufklären?

War es hilfreich?

Lösung

SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged += 
    new PropertyChangedEventHandler(intList_Changed);

implementiert INotifyPropertyChanged explizit , was bedeutet, dass Sie die Instanz an die Schnittstelle werfen, bevor Sie die Methoden des Interface zugreifen können, Eigenschaften und Ereignisse. Wie, warum dies geschehen ist, weiß ich nicht. Die n rel="noreferrer"> nicht " wissen“ObservableCollections oder jede andere Art. Es prüft Arten zu sehen, ob sie bestimmte Schnittstellen / Basisklassen (INPC, INCC, DependencyObject, usw.) implementieren oder erweitern und so kümmert sich nicht darum, ob die Schnittstelle explizit implementiert ist.

Andere Tipps

ObservableCollection (int .NET 3.5) erscheint das Property Ereignis in einem interessante Art und Weise .

protected event PropertyChangedEventHandler PropertyChanged;

event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged;

Das bedeutet, dass die geschützten Property Ereignis wahrscheinlich gemeint ist, nur für die interne Implementierung verwendet werden. Die andere INotifyPropertyChanged.PropertyChanged Veranstaltung ist derjenige, der die Umsetzung der tatsächlich erfüllt INotifyPropertyChanged Schnittstelle als ein explizite Schnittstelle . Merkwürdiger sehe ich nicht an jedem Ort innerhalb des ObservableCollection, wo die INotifyPropertyChanged.PropertyChanged tatsächlich angehoben wird. Dies kann signalisieren, dass dies einen Fehler in .NET 3.5 war, obwohl ich nicht getestet, um zu bestätigen, ob zum Beispiel eine Eigenschaft geänderte Ereignis für den Grafen ausgelöst wird, wenn ein Element in einer Sammlung hinzugefügt wird, aber das scheint zu sein, wie es funktionieren soll .

In der .NET 4.0 Implementierung scheint es, dass die INotifyPropertyChanged.PropertyChanged Ereignis Haken anstatt auf die gleich privat Delegierten, die von dem geschützten Property Ereignisse, das ein Fehler gewesen sein mag Fix. Es ist auch möglich, dies ist nur aufgrund Unterschiede, wie Auto Ereignis Implementierungen .NET 4.0 behandelt in.

Korrektur: Ich habe festgestellt, dass die INotifyPropertyChanged.PropertyChanged Veranstaltung von ObservableCollection angehoben wird, so dass die Annahmen ich oben auf Ergebnisse, die gemacht von Reflektor an der ObservableCollection Umsetzung aussehen müssen ungenau sein. Meine Vermutung ist, dass Reflektor, etwas zu tun seltsame Fehler ist, ich habe keinen Beweis, dass noch.

So Ihr Beispiel an der Arbeit würden Sie für diese Arbeit zu schreiben, müssen wie im folgende Beispiel nur aussehen würde als Will in seiner Antwort unter Beweis gestellt hat.

SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged += 
    new PropertyChangedEventHandler(intList_Changed);

Interessante richtig? Explizite Schnittstellen wird in erster Linie verwendet, um unvermeidliche Kollisionen Mitglieder für eine bestimmte Schnittstelle erforderlich zu vermeiden, aber sie können die Existenz eines Mitglieds in einem gewissen Sinne zu nutzen verbergen.

Wenn Sie möchten, Eigenschaftsänderungsereignisse für Ihre eigenen Eigenschaften erhöhen, die Sie in Ihrer Unterklasse Blick einführen in zwingende und / oder den Aufruf der geschützten OnPropertyChanged Methode, die ObservableCollection auch implementiert. Diese Technik ist ein gut angenommen Standard und ermöglicht Subklassen Ereignisse zu erhöhen oder Ereignisse zu behandeln, ohne Zugriff auf die zugrunde liegenden Ereignisdelegaten zu haben. Es ist im allgemeinen diese Technik auch durch die Art und Weise zu verwenden, bevorzugt stattdessen eine Unterklasse Haken Event-Handler zu müssen, seine eigene Basisklassen Veranstaltungen. Weitere Beispiele sehen Sie, wie die Ereignisse in verschiedenen Kontrollen in WinForms und WPF implementiert.

Ich habe versucht, eine neue Eigenschaft in

hinzufügen
public class ResultCollection<T> : ObservableCollection<T>
{

        Boolean _val;
        public Boolean Val
        {   
            get
            {   
                return _val;
            }
            set
            {   
                _val= value;
                OnPropertyChanged(new PropertyChangedEventArgs("Val"));
            }
        }
}

Ich bemerkte wirklich nicht, dass Property definiert ist geschützt . Schließlich bewegt Val Eigenschaft Ansichtsmodell.

Die Benutzeroberfläche kann und benachrichtigt bekommt. Dies ist eine Einschränkung JUST mit ObservableCollection, die dem Property Ereignis als geschützt definiert.

FWIW, ich glaube, Sie besser sind weg verlassen ObservableCollection allein und nur eine andere Eigenschaft auf Ihre VM hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top