INotifyPropertyChanged禁用Button和CheckBox

时间:2016-03-25 21:17:29

标签: c# wpf xaml button inotifypropertychanged

我使用以下命令更新GUI上的按钮

PropertyChanged(this, new PropertyChangedEventArgs(resetButton.IsEnabled = false));

然而,我收到错误`

  

参数1:无法从'bool'转换为'string'

修改

单击该按钮时要禁用的按钮的XAML代码。

resetButton.IsEnabled = false是我最初尝试用来禁用它的。

<Button x:Name="resetButton"
        Grid.Row="1" 
        HorizontalAlignment="Right" 
        VerticalAlignment="Bottom" 
        Width="80" 
        Content="Reset" 
        Style="{StaticResource BlueButton}"
        Click="resetButton_Click"/>

1 个答案:

答案 0 :(得分:-1)

我将首先讨论编译器抱怨的仅仅是语法错误:

你调用

new PropertyChangedEventArgs(resetButton.IsEnabled = false)

在那里,表达

resetButton.IsEnabled = false

将评估为bool。因此,您将bool传递给PropertyChangedEventArgs的构造函数。

但是,that constructor需要string,即更改后的属性的名称。

现在,关于预期的结果:

  

我使用以下命令更新GUI上的按钮

不,你不是。至少,不是直接。

可以使用PropertyChanged调用的内容是触发任何使用PropertyChanged事件注册的事件处理程序,然后可以执行您希望他们执行的操作,例如更新GUI中的内容。

因此,在代码的其他地方,你必须写下这样的东西:

myObject.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
    resetButton.IsEnabled = false;
}

这将创建一个匿名方法,并将其注册为事件的事件处理程序。

现在,通常是,您还需要检查e参数上的PropertyName property,以查看 myObject属性实际上已经改变了。

在这里,我们回到你对事件的触发:你必须在构造PropertyChangedEventArgs实例时传入已更改属性的属性名称。

如果您的媒体资源属于bool类型(或者您有适当的value converter可将您的媒体资源转换为bool),则可以还直接将XAML中的resetButton.IsEnabled属性绑定到您的属性。然后它将自动注册一个带有PropertyChanged事件的处理程序,以便在需要时更新按钮的启用状态。