2009-06-26 4 views
1

Ich verwende das Model View View-Model-Muster für eine WPF-App. Ich habe ein ViewModel (als Seiten DataContext festgelegt) mit zwei Eigenschaften, von denen eine eine Entity mit einem PropertyChanged-Ereignis ist. Im Event-Handler setze ich den Wert der anderen Eigenschaft (ein boolescher Wert) auf einen Wert.WPF: Aktualisieren eines Steuerelements mit einer gebundenen Eigenschaft mithilfe der Modellansicht View-Model

Jetzt sind die Button und TextBox-Eigenschaften beim ersten Laden bindend und das PropertyChanged-Ereignis wird ausgelöst und macht seine Sache. Die IsEnable-Eigenschaft der Schaltfläche wird jedoch nicht aktualisiert, um die Änderung der Eigenschaft widerzuspiegeln, an die sie gebunden ist.

Das Ansichtsmodell sieht sorta wie folgt aus:

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; 
    } 
} 

Und das XAML sieht sorta wie folgt aus:

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

Wie kann ich den Knopf seiner IsEnable Eigenschaft zu aktualisieren, wenn ich die zugrunde liegenden Eigenschaft ändern im ViewModel?

Antwort

4

Ist das der tatsächliche Code Ihres ViewModels? Wenn dies der Fall ist, besteht Ihr Problem darin, dass Ihr ViewModel INotifyPropertyChanged nicht implementiert. WPF kann nicht wissen, dass sich die VM-Eigenschaft "Bearbeiten" geändert hat, sodass die Bindung der Schaltfläche nicht aktualisiert wird.

+0

oops, Ihr Recht. Ich habe die Schnittstelle implementiert und das Ereignis jetzt ausgelöst, wenn die Bearbeitung geändert wird. Das war alles was benötigt wurde. Vielen Dank. – andrej351

2

Wenn der Code setzt Editing zu true, die nicht das PropertyChanged Ereignis auszulösen scheint, so die Button keine Ahnung hat, dass sie die Bindung für IsEnabled aktualisieren sollen. Probieren Sie etwas wie folgt aus:

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; 
     } 
    } 
} 

Beachten Sie, dass die Editing überprüfen müssen nicht die PropertyChanged Ereignis verursachte Feuer, sonst werden Sie eine Endlosschleife bekommen.