2017-06-16 59 views
-1

我有一個將被啓用或使用一個布爾值的禁用按鈕,我使用MVVM:禁用和啓用按鈕使用變量

按鈕:

<Button x:Name="backButton" Content="Back" Command="{Binding BackCommand}" 
IsEnabled="{Binding Path=BackBool, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> 

的布爾:

public bool BackBool 
    { 
     get { return isBackEnabled; } 
     set 
     { 
      this.RaisePropertyChangedEvent("isBackEnabled"); 
      isBackEnabled = value; 
      this.RaisePropertyChangedEvent("isBackEnabled"); 
     } 
    } 

我已經將bool添加到變量手錶,並且它應該在啓用按鈕時正確更新爲true。

但是,他們自己的按鈕不會更新,並始終保持禁用狀態。

我錯過了什麼嗎?

+3

*改變,通過*屬性*名稱參數:'this.RaisePropertyChangedEvent(「BackBool」)'。順便說一句,命令(ICommand)具有CanExecute方法,如果Button.Command被綁定,則Button.IsEnabled基於CanExecute的返回值設置。 – ASh

+0

在更新後臺字段之前,不應激發'PropertyChanged'事件。此時,您可以觸發['INotifyPropertyChanging'](https://msdn.microsoft.com/library/system.componentmodel.inotifypropertychanging(v = vs.110).aspx)接口的'PropertyChanging'事件。 – Maxim

+0

向下投票解釋請 –

回答

1

修改代碼的版本

按鈕:

<Button x:Name="backButton" Content="Back" Command="{Binding BackCommand}" 
IsEnabled="{Binding Path=BackBool, Mode=OneWay}"/> 

的布爾:

如果你想提高*物業
public bool BackBool 
{ 
    get { return isBackEnabled; } 
    set 
    { 
     isBackEnabled = value; 
     this.RaisePropertyChangedEvent("BackBool"); 
    } 
} 
4

提高PropertyChanged與價值改變的財產的名稱。您在XAML中給出了Binding恰好一條適用的信息:字符串「BackBool」。

public bool BackBool 
{ 
    get { return isBackEnabled; } 
    set 
    { 
     isBackEnabled = value; 
     this.RaisePropertyChangedEvent("BackBool"); 
    } 
} 

另外,省略綁定中的no-op標誌。直到您在MSDN上查找並確定它的功能之後,才能在綁定上設置屬性。在堆棧溢出(Stack Overflow)中節省了大量的責難,並且你自己的許多時間測試了無法改變的更改。

<Button 
    x:Name="backButton" 
    Content="Back" 
    Command="{Binding BackCommand}" 
    IsEnabled="{Binding Path=BackBool}" 
    /> 
+2

小提示所有WPF開發人員:如果您使用C#6或更高版本,當您觸發'PropertyChanged'時,使用'nameof'運算符傳遞屬性名稱。如果您決定在未來重命名一個屬性,它會更容易。 – Maxim