14

我正在使用 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;
    }
    ....
}

因此,由于我需要在第一次打开窗口时不启用我的按钮,所以我将变量设置isDoSomethingButtonEnabledfalse. 它可以工作,按钮在开始时被禁用,但我的问题是当我在运行时将变量更改为isDoSomethingButtonEnabledtrue的按钮仍然被禁用。

isDoSomethingButtonEnabled在将变量更改为后,我什至做了一些测试true,打印结果DoSomethingCommand.CanExecute()并显示“真”!

那么,我应该怎么做才能启用我的按钮?

先感谢您

4

1 回答 1

15

接口上有一个名为CanExecuteChangedICommand的​​事件:

当发生影响命令是否应执行的更改时发生。

使用 Prism DelegateCommand,您可以使用以下方法引发此事件RaiseCanExecuteChanged

public void SomeMethod()
{
    //do some work
    isDoSomethingButtonEnabled = true;
    DoSomethingCommand.RaiseCanExecuteChanged();
}
于 2012-06-06T20:51:37.767 回答