2010-04-19 3 views
7

Normalement, lorsque vous souhaitez mettre à jour un contrôle de base de données, utilisez l'événement "PropertyChanged" pour signaler à l'interface que les données ont changé en arrière-plan.Liaison de mise à jour WPF lorsqu'elle est liée directement à DataContext avec convertisseur

Par exemple, vous pourriez avoir un TextBlock qui est lié à la datacontext avec une propriété "DisplayText"

<TextBlock Text="{Binding Path=DisplayText}"/>

A partir de là, si le DataContext déclenche l'événement PropertyChanged avec PropertyName "DisplayText", puis Le texte de ce bloc de texte doit être mis à jour (en supposant que vous n'avez pas modifié le mode de la liaison).

Cependant, j'ai une liaison plus complexe qui utilise de nombreuses propriétés hors du contexte de données pour déterminer l'apparence finale du contrôle. Pour ce faire, je me lie directement au datacontext et utilise un convertisseur. Dans ce cas, je travaille avec une source d'image.

<Image Source="{Binding Converter={StaticResource ImageConverter}}"/>

Comme vous pouvez le voir, j'utiliser un {} La liaison sans chemin pour lier directement au datacontext, et j'utiliser un ImageConverter pour sélectionner l'image que je suis à la recherche. Mais maintenant je n'ai aucun moyen (que je connaisse) de dire cette liaison à mettre à jour. J'ai essayé d'élever l'événement propertychanged avec "." comme le propertyname, qui n'a pas fonctionné.

Est-ce possible? Dois-je inclure la logique de conversion dans une propriété à laquelle la liaison peut être attachée ou y a-t-il un moyen de dire à la liaison de se rafraîchir (sans rafraîchir explicitement la liaison)?

Toute aide serait grandement appréciée. Merci! -Adam

Répondre

17

La solution ici est d'ajouter une propriété à mon objet (à utiliser comme datacontext) appelée « Self », qui tout simplement retourné

public Object Self { get { return this; }}

Puis dans la reliure je cette propriété:

<Image Source="{Binding Path=Self, Converter={StaticResource ImageConverter}}"/>

Puis quand je l'appelle

PropertyChanged(this, new PropertyChangedEventArgs("Self"))

cela fonctionne comme un charme.

Merci à tous.

+0

MERCI! J'étais folle à la recherche de cela et était sur le point de le demander quand il est apparu sur mes suggestions – HDD

0

Hmm, vous ne montrez pas l'implémentation complète. Mais je pense qu'il devrait mettre à jour, si la valeur liée à l'interface graphique fournit l'événement PropertyChanged.

Cordialement

+0

Le problème est que la source d'image est liée directement au datacontext, pas une propriété du datacontext. Le convertisseur prend le datacontext et renvoie une source d'image. Pour clarifier, la mise à jour se produit (fonctionne) si j'utilise une liaison qui a un chemin d'accès à une propriété du datacontext, puis appelez PropertyChanged pour cette propriété. Cependant, j'ai besoin de l'objet lui-même pour déterminer l'image (plus que juste une propriété). Merci. – Adam

+0

eu une pensée tout en tapant cela. Je vais essayer de mettre une propriété sur mon objet appelé "Self" qui retourne juste elle-même, puis appelle PropertyChanged ("Self"). Je vais donner un coup de feu. – Adam

2

Je ne crois pas qu'il y ait un moyen d'accomplir exactement ce dont vous avez besoin avec votre convertisseur de courant. Comme vous l'avez mentionné, vous pouvez faire le calcul dans votre ViewModel, ou vous pouvez changer votre convertisseur en IMulitValueConverter. De votre scénario spécifique (le convertisseur lié à une classe ViewModel, et quelques-unes de ses propriétés), je pencherais vers l'implémentation de la logique dans le ViewModel.

Questions connexes