我发现了一个奇怪的行为,在ICommand
接口的自定义实现中我有RaiseCanExecuteChanged
方法可以从外部调用并导致调用和重新评估CanExecute
方法并更改命令状态(和按钮):
public void RaiseCanExecuteChanged()
{
if (_canExecuteChanged != null)
_canExecuteChanged(this, EventArgs.Empty);
}
但是当事件被实现为属性时:
public event EventHandler CanExecuteChanged;
它不起作用且CanExecuteChanged
为null
。
将其更改为
private EventHandler _canExecuteChanged;
public event EventHandler CanExecuteChanged
{
add { _canExecuteChanged += value; }
remove { _canExecuteChanged -= value; }
}
它有效。
该命令绑定到按钮Command
属性。
任何人都可以向我解释这个吗?谢谢。
答案 0 :(得分:1)
使用属性语法时,需要在方法中使用CanExecuteChanged
:
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
CanExecuteChanged(this, EventArgs.Empty);
}
此外,您应该从班级中删除_canExecuteChanged
,因为它不会被使用。
BTW:RaiseCanExecuteChanged
的以下实施更好,因为它不容易出现竞争条件:
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
handler(this, EventArgs.Empty);
}
答案 1 :(得分:1)
我遇到了类似的问题。经过大量根本原因分析后发现我在MainPage.xaml页面中初始化了MainpageData Context两次。第二次初始化是在页面上的Grid内意外发生的。请检查这些错误,因为CanExecuteChanged事件可能无法正确初始化