2009-06-26 5 views
1

J'utilise le modèle View View-Model pour une application WPF. J'ai un ViewModel (défini en tant que pages DataContext) avec deux propriétés, dont l'une est une entité avec un événement PropertyChanged. Dans le gestionnaire d'événements, je définis la valeur de l'autre propriété (un booléen) à une certaine valeur.WPF: actualisation d'un contrôle avec une propriété liée à l'aide de la vue Modèle View-Model

Maintenant, les propriétés Button et TextBox se lient correctement au premier chargement et l'événement PropertyChanged déclenche et fait sa chose. Toutefois, la propriété IsEnable de Button ne se met pas à jour pour refléter la modification de la propriété à laquelle elle est liée.

Le ViewModel ressemble sorta comme ceci:

public sealed class CustomerPageViewModel 
{ 
    public Customer Customer 
    { 
     get; 
     set; 
    } 

    public bool Editing 
    { 
     get; 
     private set; 
    } 

    private void Customer_PropertyChanged(object sender, 
     System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     Editing = true; 
    } 
} 

Et le XAML ressemble sorta comme ceci:

<TextBox Text="{Binding Customer.Name}" /> 
<Button Content="Save Changes" IsEnabled="{Binding Editing}" /> 

Comment puis-je obtenir le bouton pour mettre à jour sa propriété IsEnable lorsque je change la propriété sous-jacente dans le ViewModel?

Répondre

4

Est-ce le code réel de votre ViewModel? Si oui, votre problème est que votre ViewModel n'implémente pas INotifyPropertyChanged. WPF ne peut pas savoir que votre propriété "Modification" de la machine virtuelle a été modifiée, donc elle ne met pas à jour la liaison du bouton.

+0

oups, votre droite. J'ai implémenté l'interface et déclenché l'événement maintenant lorsque l'édition est modifiée. C'était tout ce qui était nécessaire. Merci. – andrej351

2

Lorsque le code définit Editing à true, qui ne semble pas déclencher l'événement PropertyChanged, de sorte que le Button n'a aucune idée qu'il devrait mettre à jour la liaison pour IsEnabled. Essayez quelque chose comme ceci:

public sealed class CustomerPageViewModel : INotifyPropertyChanged 
{ 
    public Customer Customer 
    { 
     get; 
     set; 
    } 

    private bool editing = false; 
    public bool Editing 
    { 
     get { return editing; } 
     private set 
     { 
      editing = value; 
      Customer_PropertyChanged(this, new PropertyChangedEventArgs("Editing"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void Customer_PropertyChanged(object sender, 
     System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     PropertyChanged(this, e); 

     if(!e.PropertyName.Equals("Editing")) 
     { 
      Editing = true; 
     } 
    } 
} 

Notez que vous devez vérifier que Editing n'a pas causé l'événement PropertyChanged au feu, sinon vous aurez une boucle infinie.

Questions connexes