2009-06-26 178 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事件觸發,否則你會得到一個無限循環。