Problème avec WPF Liaison de Données Défini dans le Code, Pas de mise à Jour des Éléments de l'INTERFACE utilisateur
J'ai besoin de définir de nouveaux Éléments de l'INTERFACE utilisateur ainsi que la liaison de données dans le code parce qu'ils seront mis en œuvre après l'exécution. Voici une version simplifiée de ce que je suis en train de faire.
Modèle De Données:
public class AddressBook : INotifyPropertyChanged
{
private int _houseNumber;
public int HouseNumber
{
get { return _houseNumber; }
set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string sProp)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(sProp));
}
}
}
De liaison dans le Code:
AddressBook book = new AddressBook();
book.HouseNumber = 123;
TextBlock tb = new TextBlock();
Binding bind = new Binding("HouseNumber");
bind.Source = book;
bind.Mode = BindingMode.OneWay;
tb.SetBinding(TextBlock.TextProperty, bind); //Text block displays "123"
myGrid.Children.Add(tb);
book.HouseNumber = 456; //Text block displays "123" but PropertyChanged event fires
Lorsque les données sont d'abord liés, le bloc de texte est mis à jour avec le bon numéro de la maison. Alors, si je change le numéro de la maison dans le code plus tard, le livre de l'événement PropertyChanged feux, mais le bloc de texte n'est pas mis à jour. Quelqu'un peut me dire pourquoi?
Grâce,
Ben
Avez-vous essayé de définir des points d'arrêt pour voir si ils ont atteint lorsque vous définissez la propriété?
Oui, j'ai une boîte de message apparaît quand le livre de l'événement PropertyChanged incendies, qui se produit à chaque mise à jour des données.
Le plus intéressante réponse, OMI, est par @StevenRobbins , si elle est undervoted et par la suite enterré à l'intérieur d'autres réponses
Oui, j'ai une boîte de message apparaît quand le livre de l'événement PropertyChanged incendies, qui se produit à chaque mise à jour des données.
Le plus intéressante réponse, OMI, est par @StevenRobbins , si elle est undervoted et par la suite enterré à l'intérieur d'autres réponses
OriginalL'auteur Ben McIntosh | 2009-01-02
Vous devez vous connecter pour publier un commentaire.
La racine de la chaîne que j'ai transmis à PropertyChangedEventArgs ne pas correspondre EXACTEMENT au nom de la propriété. J'ai eu quelque chose comme ceci:
Où il devrait être:
Aïe! Merci pour le pousser dans la bonne direction.
J'ai changé la propriété réelle des noms que j'ai été en utilisant le protéger les innocents 🙂
J'étais sur le point de suggérer cela comme un problème commun. INotifyPropertyChanged est si fragile. Je souhaite que nous n'étions pas obligés d'employer de tels crud.
Jetez un oeil à la MVVM de l'Échantillon (msdn.microsoft.com/en-us/magazine/dd419663.aspx). Il dispose d'une mise en œuvre de INotifyPropertyChanged qui utilise la Réflexion pour vous assurer que le nom passé correspond à une propriété. Il aide.
OriginalL'auteur Ben McIntosh
Assurez-vous que vous êtes à la mise à jour de la
AddressBook
de référence qui a été utilisé dans la liaison, et non pas une autreAddressBook
de référence.J'ai eu la suite de travailler avec le Carnet d'adresses de code que vous avez donné.
Code derrière:
Note la même référence est utilisée dans le code de mise à jour.
OriginalL'auteur Cameron MacFarland
Avez-vous besoin pour définir le mode de liaison par programmation? Il peut être défaut Ponctuel.
J'ai peut-être une erreur de lecture, mais les sons comme Beepcake les moyens essayer le réglage de la BindingMode à BindingMode.TwoWay. TextBlocks sont OneWay par défaut.
Le code en question fonctionne vraiment sans
BindingMode
OriginalL'auteur Steven Robbins
Je viens de coupe+collé votre code (et ajouté un peu), et il fonctionne très bien pour moi:
Affiche 456 au démarrage, en cliquant sur le bouton permet de le nombre dans le TextBlock incrément de l'amende juste.
Peut-être vous êtes à la recherche dans le mauvais endroit pour la cause du problème?
OriginalL'auteur Steven Robbins
Êtes-vous sûr que vous effectuez une mise à jour sur le même objet que vous avez utilisé dans la liaison? À première vue, rien ne semble mauvais, afin de vérifier les choses les plus simples. 🙂
J'ai créé une unique instance d'objet appelé "test" et mis à jour une seule fois avant de liaison et une fois après la liaison et le bloc de texte est resté à la valeur avant la liaison, même si l'événement PropertyChanged pour les "essais" de feu.
OriginalL'auteur Giraffe
N'importe quel code de contournement de la propriété, le réglage du champ (
_houseNumber
) directement?Vrai, vrai... juste essayer de penser pourquoi le texte-bloc n'est pas mise à jour...
Assurez-vous simplement que je n'étais pas dim 🙂 Mon argent est sur le code de mise à jour d'une instance différente de Carnet d'adresses 🙂
OriginalL'auteur Marc Gravell