【发布时间】:2017-07-31 11:18:53
【问题描述】:
当我在默认情况下尝试禁用命令时(即使没有传递 CanExecute 谓词),我的 asny ICommand 实现遇到了一个奇怪的行为。
public bool CanExecute(object parameter)
{
if (CanExecutePredicate == null)
{
return !mIsExecuting;
}
return !mIsExecuting && CanExecutePredicate(parameter);
}
public async void Execute(object parameter)
{
mIsExecuting = true;
await ExecuteAsync(parameter);
mIsExecuting = false;
}
我尝试引入一个私有布尔值,在执行之前我将其设置为 true,之后设置为 false。执行完成后设置布尔值,但 CanExecute 仅在我单击鼠标按钮或移动鼠标或 w/e 后调用。
现在我试着打电话
CanExecute(null);
之后
mIsExecuting = false;
但这也无济于事。我不知道我错过了什么。
感谢您的帮助
编辑:
为了澄清,我也为这个类添加了构造函数:
public AsyncRelayCommand(Func<object, Task> execute)
: this(execute, null)
{
}
public AsyncRelayCommand(Func<object, Task> asyncExecute,
Predicate<object> canExecutePredicate)
{
AsyncExecute = asyncExecute;
CanExecutePredicate = canExecutePredicate;
}
protected virtual async Task ExecuteAsync(object parameter)
{
await AsyncExecute(parameter);
}
【问题讨论】:
-
Execute在哪里发挥作用? -
您在何时何地设置
CanExecutePredicate? -
@AlessandroD'Andria 我没有设置它,它现在总是为空
-
@user3292642 抱歉,我不清楚您的问题是什么,我只能看到
CanExecutePredicate可能存在竞争条件。 -
@AlessandroD'Andria 问题是我的 GUI 没有更新,即使我打电话给
CanExecute(null);。你能详细说明一下可能的竞争条件吗?