CanExecuteChanged事件的奇怪行为

时间:2012-10-15 09:59:41

标签: wpf command state

我发现了一个奇怪的行为,在ICommand接口的自定义实现中我有RaiseCanExecuteChanged方法可以从外部调用并导致调用和重新评估CanExecute方法并更改命令状态(和按钮):

public void RaiseCanExecuteChanged()
{
  if (_canExecuteChanged != null)
    _canExecuteChanged(this, EventArgs.Empty);
}

但是当事件被实现为属性时:

public event EventHandler CanExecuteChanged;

它不起作用且CanExecuteChangednull

将其更改为

private EventHandler _canExecuteChanged;
public event EventHandler CanExecuteChanged
{
  add { _canExecuteChanged += value; }
  remove { _canExecuteChanged -= value; }
}

它有效。

该命令绑定到按钮Command属性。

任何人都可以向我解释这个吗?谢谢。

2 个答案:

答案 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事件可能无法正确初始化