1

我发现了一个奇怪的行为,在接口的自定义实现中,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属性。

谁能给我解释一下?谢谢你。

4

2 回答 2

1

当你使用属性语法时,你需要CanExecuteChanged在你的方法中使用:

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

此外,您应该从您的课程中删除_canExecuteChanged,因为它不会被使用。

顺便说一句:以下实现RaiseCanExecuteChanged更好,因为它不容易出现竞争条件:

public void RaiseCanExecuteChanged()
{
    var handler = CanExecuteChanged;
    if (handler != null)
        handler(this, EventArgs.Empty);
}
于 2012-10-15T10:01:25.233 回答
1

我遇到了类似的问题。经过大量根本原因分析后,我在 MainPage.xaml 页面中初始化了 MainpageData Context 两次。第二次初始化是在页面上的 Grid 内偶然发生的。请检查此类错误,因为 CanExecuteChanged 事件可能无法正确初始化

于 2016-06-02T13:22:19.333 回答