gpt4 book ai didi

c# - DelegateCommand 的 CanExecute 逻辑

转载 作者:可可西里 更新时间:2023-11-01 08:05:35 26 4
gpt4 key购买 nike

更新:焦点变成了 MVVM 而不是实际问题,所以我正在更新它。

DelegateCommandCanExecute 有问题。在我调用 RaiseCanExecuteChanged 之前它没有更新,这是期望的行为吗?

enter image description here

我在此处上传了一个重现此问题的简单示例项目:http://dl.dropbox.com/u/39657172/DelegateCommandProblem.zip

问题是这样的,我有两个这样的 Buttons。一个是将 Command 绑定(bind)到 RelayCommand 实现,另一个是绑定(bind)到 DelegateCommand

的 Prism 实现
<Button Command="{Binding DelegateSaveCommand}"/>
<Button Command="{Binding RelaySaveCommand}"/>

ViewModel ICommands

DelegateSaveCommand = new DelegateCommand(Save, CanSaveDelegate);
RelaySaveCommand = new RelayCommand(param => Save(), param => CanSaveRelay);

CanExecute 方法/谓词

public bool CanSaveDelegate()
{
return HasChanges;
}
public bool CanSaveRelay
{
get { return HasChanges; }
}

两者都使用属性 HasChanges。当 HasChanges 更新时,只有 CanSaveRelay 更新。这就是它应有的样子吗?

最佳答案

如前所述,这是 DelagateCommand 的预期行为,而不是错误。DelegateCommand 不会自动引发 CanExecuteChanged 事件,您必须在适当的时候通过调用 RaiseCanExecuteChanged 手动引发该事件。而 RelayCommand 中继 CommandManager.RequerySuggested 事件。每次用户单击某处或按下按钮时都会引发此事件。

对于不太方便或没有合适的地方调用 RaiseCanExecuteChanged 的情况(比如在你的场景中你必须订阅模型上的 PropertyChanged 事件,等)我创建了以下简单包装器,确保包装命令的 CanExecute 方法在 CommandManager.RequerySuggested 事件上自动执行:

public class AutoCanExecuteCommandWrapper : ICommand
{
public ICommand WrappedCommand { get; private set; }

public AutoCanExecuteCommandWrapper(ICommand wrappedCommand)
{
if (wrappedCommand == null)
{
throw new ArgumentNullException("wrappedCommand");
}

WrappedCommand = wrappedCommand;
}

public void Execute(object parameter)
{
WrappedCommand.Execute(parameter);
}

public bool CanExecute(object parameter)
{
return WrappedCommand.CanExecute(parameter);
}

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}

你可以这样使用它:

DelegateSaveCommand = new AutoCanExecuteCommandWrapper(new DelegateCommand(Save, CanSaveDelegate));

关于c# - DelegateCommand 的 CanExecute 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7350845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com