2009-06-26 127 views
1

我使用一个WPF应用程序模型 - 视图 - 视图模型模式的绑定属性的控件。我有一个ViewModel(设置为页面DataContext)与两个属性,其中之一是一个实体与PropertyChanged事件。在事件处理程序中,我将其他属性(布尔值)的值设置为某个值。WPF:清爽的使用模型视图视图模型

现在的按钮和文本框属性是第一次加载结合精致和PropertyChanged事件被解雇,做它的事。但是,Button的IsEnable属性不会更新以反映其绑定属性的更改。

视图模型看起来有几分像这样:

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

而XAML八九不离十是这样的:

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

我怎样才能获得该按钮时,我改变基本属性更新其IsEnable财产在ViewModel中?

回答

4

那是你的视图模型的实际代码?如果是这样,你的问题是你的ViewModel没有实现INotifyPropertyChanged。 WPF无法知道您的“编辑”VM属性已更改,因此它不会更新按钮的绑定。

+0

哎呀,你的权利。当编辑改变时,我现在实现了界面并且提出了事件。这就是所需要的。 谢谢。 – andrej351 2009-06-26 02:33:48

2

当代码设置Editingtrue,不会出现触发事件PropertyChanged,所以Button不知道它应该更新IsEnabled的结合。尝试是这样的:

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

请注意,您必须验证Editing没有引起PropertyChanged事件触发,否则你会得到一个无限循环。