OneWayToSource de liaison de propriété readonly en XAML
Je suis en train de le lier à un Readonly
propriété avec OneWayToSource
comme mode, mais il semble que ce ne peut pas être fait dans le code XAML:
<controls:FlagThingy IsModified="{Binding FlagIsModified,
ElementName=container,
Mode=OneWayToSource}" />
J'obtiens:
La propriété 'FlagThingy.IsModified' ne peut pas être ensemble parce qu'il n'a pas un accessible accesseur set.
IsModified
est un readonly DependencyProperty
sur FlagThingy
. Je veux lier cette valeur à la FlagIsModified
de propriété sur le conteneur.
Pour être clair:
FlagThingy.IsModified --> container.FlagIsModified
------ READONLY ----- ----- READWRITE --------
Est-ce possible en utilisant seulement XAML?
Mise à jour: Bien, j'ai fixé ce cas, en mettant la liaison sur le conteneur et non sur la FlagThingy
. Mais je voudrais encore savoir si cela est possible.
- Mais comment pouvez-vous définir la valeur d'une propriété en lecture seule?
- Vous ne pouvez pas. C'est pas non plus ce que je suis en train de réaliser. Je vais essayer d'obtenir DE propriété readonly
IsModified
readwrite propriétéFlagIsModified
. - Bonne question. Votre solution de contournement ne fonctionne que si le conteneur est un DependencyObject et FlagIsModified est une DependencyProperty.
- La grande question, cependant je ne comprends pas la accepté de répondre. J'apprécierais si certains WPF guru pourrait m'éclairer certaines plus - Est-ce un bug ou par le design?
- selon ceci c'est un bug. pas de solution en vue, cependant.
Vous devez vous connecter pour publier un commentaire.
Certains résultats de la recherche pour OneWayToSource...
Option # 1.
Option # 2
Option # 3 (Vrai en lecture seule propriété de dépendance)
Système.ArgumentException: 'Modifiés' propriété ne peut pas être lié aux données.
Réflecteur donne la réponse:
C'est une limitation de WPF et c'est par la conception. Il est rapporté sur Connectez-vous ici:
OneWayToSource de liaison à partir d'une lecture-seule propriété de dépendance
J'ai fait une solution dynamiquement être en mesure de pousser en lecture seule des propriétés de dépendance à la source appelée
PushBinding
qui je blogué sur ici. L'exemple ci-dessous neOneWayToSource
des Fixations de la lecture seule du DPActualWidth
etActualHeight
à la Largeur et la Hauteur de laDataContext
PushBinding
fonctionne en utilisant deux Propriétés de Dépendance, de l'Écouteur et d'un Miroir. L'auditeur est tenuOneWay
à la TargetProperty et dans lePropertyChangedCallback
il met à jour la propriété Miroir qui est liéOneWayToSource
pour tout ce qui était spécifié dans la Liaison.Projet de démonstration peut être Téléchargée Ici.
Il contient le code source et à court d'exemples d'utilisation, ou visitez mon blog WPF si vous êtes intéressé par les détails de mise en œuvre.
A écrit ceci:
Utilisation:
Code:
Ne l'ai pas testé dans des styles et des modèles encore, suppose que les besoins de revêtement spécial.
Voici une autre propriété attachée solution basée sur SizeObserver détaillée ici Poussant en lecture seule GUI le retour des biens dans le ViewModel
Déclarer propriété attachée dans le contrôle de la
Voici une autre mise en œuvre pour la liaison à la Validation.HasError
Utilisation dans le code xaml
Cette mise en œuvre est spécifique à la liaison
Validation.HasError
WPF ne pas utiliser le CLR bien setter, mais il semble qu'il fait un peu bizarre de validation basée sur elle.
Peut être dans votre situation, cela peut être ok:
Hmmm... je ne suis pas sûr que je suis d'accord avec l'une de ces solutions. Comment sur la spécification d'une contrainte de rappel dans votre enregistrement de la propriété, qui ignore changement externe? Par exemple, j'avais besoin de mettre en œuvre une Position en lecture seule dépendance de la propriété pour obtenir la position d'un élément multimédia de contrôle à l'intérieur d'un contrôle de l'utilisateur. Voici comment je l'ai fait:
En d'autres termes, tout simplement ignorer le changement et retourner la valeur soutenu par un autre membre qui n'a pas un public de modificateur. - Dans l'exemple ci-dessus, MediaRenderer est en fait privé de contrôle MediaElement.
Vous êtes en train de faire la liaison dans la mauvaise direction à droite maintenant. OneWayToSource allons essayer de mettre à jour FlagIsModified sur le conteneur à chaque fois que IsModified changements sur le contrôle de la création. Vous voulez le contraire, ce qui est d'avoir IsModified lier à conteneur.FlagIsModified. Pour cela vous devez utiliser le mode de liaison Unidirectionnelle
Liste complète des membres de l'énumération: http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx
IsIsModified
, que 2) l'OP veut déclarer une liaison sur la propriété dans le code XAML et que 3) la liaison est censé travailler, dans leOneWayToSource
mode. Votre solution ne fonctionne pas, pratiquement, parce que, comme décrit dans la question, le compilateur ne vous laisseront pas de déclarer une liaison sur une propriété en lecture seule, et il ne fonctionne pas sur le plan conceptuel, carIsModified
est en lecture seule et donc sa valeur ne peut pas être changé (par la liaison).