我是MVVM的新手,我想创建一个简单的命令按钮,如果选择了列表中的任何项目,该按钮将启用,并将所选列表项添加到收藏夹列表中。这是我的AddCommand实现:
class AddFavCommand : ICommand
{
private readonly Action _favAction;
private readonly bool _canExecute;
public AddFavCommand()
{
}
public AddFavCommand(Action favAction, bool canExecute)
{
_favAction = favAction;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
_favAction();
}
}
在我的视图模型中,我具有公共属性AddFavCommand以便与我的视图进行绑定:
private AddFavCommand _addFavCommand;
private bool _canAddFavExecute;
public ICommand AddFavCommand
{
get
{
if (_addFavCommand == null)
{
_addFavCommand = new AddFavCommand(AddFav, _canAddFavExecute);
}
return _addFavCommand;
}
}
现在我有一个简单的功能,只是检查命令是否有效:
private void AddFav()
{
MessageBox.Show("Add");
}
因此,此部分无需实现canExecute属性即可完美工作。但是现在我希望在未选择列表中的列表项时禁用按钮。我有一个财产:
CurrentItem
绑定到“列表项”,如果未选择该项,则为null。我的问题是当未选择项目时如何触发按钮被禁用。我试图添加:
private void AddFav()
{
MessageBox.Show("Add");
_canAddFavExecute = CurrentItem != null; // to my function, but my button always stays disabled.
}
谢谢
如果创建了自己的委托命令,则必须提供CanExecute
如下所示的委托,并且可以CanExecuteChanged
在命令中将其注册到事件中。
_addFavCommand = new AddFavCommand(AddFav, CanExecuteCommand);
public bool CanExecuteCommand(object parameter)
{
return CurrentCommand != null;
}
并且从的设置者中,CurrentCommand
您将不得不canexecutechanged
为命令引发事件。在您的情况下,您已将布尔值提供给命令一次,因此始终将其禁用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句