C# 使用异步lambda传递参数时,RelayCommand CanExecute不工作
我有以下有效的命令:C# 使用异步lambda传递参数时,RelayCommand CanExecute不工作,c#,wpf,C#,Wpf,我有以下有效的命令: private ICommand\u AddNewCommand; 公共ICommand AddNewCommand { 得到 { 如果(_AddNewCommand==null) { _AddNewCommand=newrelaycommand(异步()=> { 等待AddNewAsync(); },添加新的命令和执行命令); } 返回_AddNewCommand; } } 根据AddNewCommand\u CanExecute方法结果,绑定到此按钮的按钮已正确启用/
private ICommand\u AddNewCommand;
公共ICommand AddNewCommand
{
得到
{
如果(_AddNewCommand==null)
{
_AddNewCommand=newrelaycommand(异步()=>
{
等待AddNewAsync();
},添加新的命令和执行命令);
}
返回_AddNewCommand;
}
}
根据AddNewCommand\u CanExecute
方法结果,绑定到此按钮的按钮已正确启用/禁用
但是,如果我想将一些参数传递到我的AddNewAsync()
方法中,我会这样做:
\u AddNewCommand=newrelaycommand(异步obj=>
{
等待AddNewAsync(obj);
},AddNewCommand_CanExecute());
请注意,AddNewCommand\u CanExecute
必须更改为AddNewCommand\u CanExecute()
但是,执行此操作时,绑定按钮始终处于启用状态,即使AddNewCommand\u CanExecute()
应返回false(假设两者之间没有更改)
这里发生了什么?您正在使用
RelayCommand
的重载,该重载接受keepTargetAlive
类型为bool
的参数
您应该使用接受Func
谓词的谓词:
_AddNewCommand = new RelayCommand<object>(async obj =>
{
await AddNewAsync(obj);
}, _ => AddNewCommand_CanExecute());
\u AddNewCommand=newrelaycommand(异步obj=>
{
等待AddNewAsync(obj);
},=>AddNewCommand_CanExecute());
请共享其余的代码,添加新命令并执行()
和RelayCommand
实现我已经添加了剩余的RelayCommand
。我没有添加CanExecute
代码,因为它只是一个方法(public bool AddNewCommand_CanExecute(){}
),带有一大堆与问题无关的逻辑,因为它在不将参数传递到命令时起作用,所以问题不在这里。@WSC:你忘了告诉我们“RelayCommand”类是如何实现的。这是最重要的。RelayCommand
来自Galasoft.Mvvmlight.CommandWpf
()。@WSC:那么您使用的重载是错误的。看看我的答案。哦,哇,我没有意识到\u=>
完全改变了它使用的重载。我想,因为我在传递一个对象和bool,所以实际上我在使用Func
。