我有一个非常简单的窗口,里面有一个按钮,与一个带有命令的ViewModel相关联。
如果MyCommand.CanExecute()为false,我期望该按钮被禁用。但是似乎WPF只会在窗口第一次绘制时设置IsEnabled属性。任何后续操作都不会影响按钮的可见状态。我正在使用Prism中的DelegateCommand。
我的视图:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Click Here" Command="{Binding MyCommand}" Width="100" Height="50"/>
</Grid>
和我的视图模型:
public class MyVM : NotificationObject
{
public MyVM()
{
_myCommand = new DelegateCommand(DoStuff, CanDoStuff);
}
private void DoStuff()
{
Console.WriteLine("Command Executed");
_myCommand.RaiseCanExecuteChanged();
}
private bool CanDoStuff()
{
var result = DateTime.Now.Second % 2 == 0;
Console.WriteLine("CanExecute is {0}", result);
return result;
}
private DelegateCommand _myCommand;
public ICommand MyCommand
{
get
{
return _myCommand;
}
}
}
当我的应用程序加载时,有50%的时间按钮会被正确地禁用。但是,如果窗口加载时按钮处于启用状态,并且我单击按钮执行命令,则希望按钮在50%的情况下变为禁用状态,但它从未发生过。命令不会执行,但我仍然可以单击按钮。如何让WPF理解当CanExecute()为false时应禁用按钮?
RaiseCanExecuteChanged()
实现不正确/有缺陷。 - user1228RaiseCanExecuteChanged
是微软的 Prism 库的一部分,不是自己编写的。 - Greg Ferreri