PropertyChanged für die index-Eigenschaft
Habe ich eine Klasse mit einem index-Eigenschaft, mit einem string-Schlüssel:
public class IndexerProvider {
public object this[string key] {
get
{
return ...
}
set
{
...
}
}
...
}
Ich eine Bindung an eine Instanz dieser Klasse in WPF, mit indexer-notation:
<TextBox Text="{Binding [IndexerKeyThingy]}">
Das funktioniert auch, aber ich möchte ein PropertyChanged
Ereignis, wenn eines der indexer Werte ändert. Ich habe versucht, hob ihn mit einer Eigenschaft namens "[keyname]" (D. H. einschließlich [] um den Namen der Taste), aber das scheint nicht zu funktionieren. Ich glaube nicht bindend, Fehler in meiner Ausgabe-Fenster zu löschen.
Kann ich nicht verwenden CollectionChangedEvent, da der index keine ganze Zahl ist, basiert. Und technisch ist das Objekt nicht in der Sammlung sowieso.
Kann ich dies tun, und so, wie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut dieser blog-Eintrag, müssen Sie
"Item[]"
. Element wird der name der Eigenschaft ist vom compiler generiert, wenn die Verwendung eines indexer.Wenn Sie wollen explizit genannt werden, können Sie schmücken die index-Eigenschaft mit einem IndexerName Attribut.
Machen würde der code so Aussehen:
Zumindest macht es die Absicht klarer. Ich glaube nicht, schlage vor, Sie ändern den indexer Namen, obwohl, wenn Ihr Kumpel gefunden der string
"Item[]"
hart codiert, es wahrscheinlich bedeutet, dass WPF nicht in der Lage wäre, sich mit einem anderen indexer Namen.FirePropertyChange
Anrufe, aber können Sienameof
der indexer in irgendeiner Weise?FirePropertyChanged
aber mitOnPropertyChanged("Item")
ist die einzige funktionierende code zumindest in Xamarin Forms. Nicht sicher, warum es ist so lästig mit den Anhängen[]
.Zusätzlich können Sie
Informieren nur Steuerelemente an IndexerKeyThingy auf die Ihr indexer.
INotifyCollectionChanged
Verhalten! Ich würde mich Wundern, wenn das funktionieren würde in Xamarin.Formen.Tatsächlich, ich glaube, die Einstellung der IndexerName Attribut "Element" ist überflüssig. Die IndexerName-Attribut ist speziell entwickelt, um einen index umbenennen, wenn Sie möchten, geben Sie s collection-Element einen anderen Namen. So könnte der code wie folgt Aussehen:
Wenn Sie den indexer Namen, was Sie wollen, Sie können dann verwenden Sie es in der FirePropertyChanged Veranstaltung.
Gibt es zumindest ein paar zusätzliche Vorsichtsmaßnahmen beim Umgang mit INotifyPropertyChang(ed/ing) und Indexer.
Die erste ist, dass die meisten der beliebte Methoden zu vermeiden Magie name der Eigenschaft strings sind unwirksam. Die Zeichenfolge erstellt, indem die
[CallerMemberName]
- Attribut fehlt die '[]' am Ende, und lambda-Ausdrücke Mitglied Probleme haben, die Ausdrücken, das Konzept.Mehrere andere Beiträge verwendet haben
Bindung.IndexerName
zu vermeiden, das string-literal"Item[]"
, das ist vernünftig, aber löst das zweite Problem. Eine Untersuchung der dissasembly der sicherheitsbezogene Teile von WPF drehte die folgenden segment in PropertyPath.ResolvePathParts.Die wiederholte Verwendung von
"Item[]"
als ein konstanter Wert deutet darauf hin, dass WPF wird erwartet, dass der name übergeben, das PropertyChanged-Ereignis, und, auch wenn es nicht um das, was die eigentliche Eigenschaft aufgerufen wird (was ich nicht bestimmen, zu meiner Zufriedenheit, eine oder andere Weise), Vermeidung der Verwendung von[IndexerName]
würde Konsistenz.