我正在处理一个小型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
可观察属性,最好的方法是什么?
答案 0 :(得分:3)
通常我有ICommand
个实例的基类,它们为 的Execute
和CanExecute
方法提供委托。在这种情况下,您可以通过闭包捕获范围内的事物。例如这些方面的东西:
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
}
}