PropertyChanged pour indexer propriété
J'ai une classe avec un indexeur de la propriété, avec une chaîne de clé:
public class IndexerProvider {
public object this[string key] {
get
{
return ...
}
set
{
...
}
}
...
}
- Je lier à une instance de cette classe dans WPF, à l'aide de l'indexeur de notation:
<TextBox Text="{Binding [IndexerKeyThingy]}">
Qui fonctionne très bien, mais j'aimerais soulever un PropertyChanged
cas lorsque l'une de l'indexation à l'évolution des valeurs. J'ai essayé de le soulever avec un nom de propriété de "[keyname]" (c'est à dire y compris [] autour du nom de la clé), mais cela ne semble pas fonctionner. Je n'ai pas de liaison des erreurs dans ma fenêtre de sortie que ce soit.
Je ne peux pas utiliser CollectionChangedEvent, parce que l'index n'est pas entier fondé. Et techniquement, l'objet n'est pas une collection de toute façon.
Puis-je faire cela, et oui, comment?
Vous devez vous connecter pour publier un commentaire.
Selon cette entrée de blog, vous devez utiliser
"Item[]"
. Élément étant le nom de la propriété généré par le compilateur lors de l'utilisation d'un indexeur.Si vous voulez être explicite, vous pouvez décorer la propriété d'indexeur avec un IndexerName attribut.
Qui rendrait le code ressembler à:
Au moins il fait l'intention plus claire. Je ne vous suggérons pas de changer le nom de l'indexeur, si votre copain a trouvé la chaîne
"Item[]"
codé en dur, cela signifie probablement que WPF ne serait pas en mesure de traiter avec un autre nom de l'indexeur.FirePropertyChange
des appels, mais pouvez-vousnameof
l'indexeur en quelque sorte?FirePropertyChanged
mais en utilisantOnPropertyChanged("Item")
est le seul code de travail au moins dans Xamarin Forms. Je ne sais pas pourquoi il est si ennuyeux avec l'ajout de[]
.De plus, vous pouvez utiliser
Pour notifier que les contrôles liés à IndexerKeyThingy sur votre indexeur.
INotifyCollectionChanged
comportement! Je me demande si cela va marcher dans les Xamarin.Les formulaires.En fait, je crois que le réglage de la IndexerName attribut "Point" est redondant. Le IndexerName attribut est spécifiquement conçu pour renommer un indice, si vous voulez donner de l'élément de la collection un nom différent. Ainsi, votre code pourrait ressembler à quelque chose comme ceci:
Une fois que vous l'indexeur nom de tout ce que vous voulez, vous pouvez ensuite l'utiliser dans le FirePropertyChanged événement.
Il y a au moins un couple d'autres limitations lorsque vous traitez avec INotifyPropertyChang(ed/ing) et des indexeurs.
La première est que la plupart des méthodes populaires d'éviter de magie nom de la propriété chaînes sont inefficaces. La chaîne créée par le
[CallerMemberName]
attribut est manquant, l' '[]' à la fin, et membre lambda expressions ont des difficultés à exprimer le concept à tous.Plusieurs d'autres postes ont utilisé
Liaison.IndexerName
pour éviter le littéral de chaîne"Item[]"
, ce qui est raisonnable, mais soulève le deuxième problème potentiel. Une enquête de la dissasembly de parties connexes de WPF tourné le segment suivant, dans PropertyPath.ResolvePathParts.L'utilisation répétée de
"Item[]"
comme une valeur constante suggère que WPF s'attend à ce que le nom passé dans l'événement PropertyChanged, et, même si elle ne se soucie pas de ce que la propriété réelle est appelé (que je n'ai pas de déterminer à ma satisfaction d'une façon ou de l'autre), évitant l'utilisation de[IndexerName]
serait de maintenir la cohérence.