我正在使用MVVM在WPF中开发一个应用程序,但我坚持使用ICommand对象。
我有一个包含一些按钮的窗口,因此,我将它们绑定到XAML中各自的ICommand,如下所示:
<Button Command="{Binding DoSomethingCommand}" Content="Do Something" />
然后,在我的视图模型类中,我写了以下内容:
public class MyViewModel : ObservableObject
{
private bool isDoSomethingButtonEnabled = false;
....
public ICommand DoSomethingCommand
{
get;
private set;
}
....
....
public MyViewModel()
{
DoSomethingCommand = new DelegateCommand<String>(this.OnDoSomething, this.CanDoSomething);
}
private void OnDoSomething(String arg)
{
}
private bool CanDoSomething(String arg)
{
return isDoSomethingButtonEnabled;
}
....
}
因此,由于我需要在第一次打开窗口时未启用我的按钮,因此我将变量isDoSomethingButtonEnabled
设置为false
。它工作正常,按钮在开始时被禁用,但我的问题是,当我在运行时将变量isDoSomethingButtonEnabled
更改为true
时,我的按钮仍处于禁用状态。
在将变量isDoSomethingButtonEnabled
更改为true
后,我甚至完成了一些测试,打印DoSomethingCommand.CanExecute()
的结果并显示&#34; true&#34;!
那么,我该怎么办才能启用我的按钮?
提前谢谢
答案 0 :(得分:14)
ICommand
界面上有一个名为CanExecuteChanged的事件:
发生影响命令是否发生的更改时发生 应该执行。
使用Prism DelegateCommand,您可以使用RaiseCanExecuteChanged
方法提升此事件:
public void SomeMethod()
{
//do some work
isDoSomethingButtonEnabled = true;
DoSomethingCommand.RaiseCanExecuteChanged();
}