Make Command的CanExecute取决于其他字段的值

时间:2015-12-16 21:11:57

标签: c# wpf mvvm

我正在处理一个小型WPF MVVM应用程序。从本质上讲,用户浏览一个文件,然后点击"执行"在文件上运行一些代码。

在我的视图模型课程中,我将两个按钮点击("浏览"和"执行")绑定到ICommand

internal class DelegateCommand : ICommand
{
    private readonly Action _action;

    public DelegateCommand(Action action)
    {
        _action = action;
    }

    public void Execute(object parameter)
    {
        _action();
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
}

internal class Presenter : INotifyPropertyChanged // VM class
{
    private string filePath;

    public string FilePath
    {
        get { return filePath; }
        set 
        { 
            filePath = value;
            RaisePropertyChangedEvent("FilePath");
        }
    }

    public ICommand ExecuteCommand
    { 
        // returns a DelegateCommand
    }

    public ICommand BrowseCommand
    { 
        // how to enable/disable button based on whether or not a file has been selected?
    }
}

此处,CanExecute始终返回true。但是,我想要发生的事情是CanExecute与文件是否被选中(即是否FilePath.Length > 0)相关联,然后链接按钮&# 39; s状态(启用/禁用)。如果不向IsFileSelected添加Presenter可观察属性,最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

通常我有ICommand个实例的基类,它们为 ExecuteCanExecute方法提供委托。在这种情况下,您可以通过闭包捕获范围内的事物。例如这些方面的东西:

private readonly DelegateCommand _executeCommand;
public DelegateCommand ExecuteCommand { /* get only */ }

public Presenter()
{
    _excuteCommand = new DelegateCommand
    (
        () => /* execute code here */,
        () => FilePath != null /* this is can-execute */
    );
}

public string FilePath
{
    get { return filePath; }
    set 
    { 
        filePath = value;
        RaisePropertyChangedEvent("FilePath");
        ExecuteCommand.OnCanExecuteChanged(); // So the bound control updates
    }
}