2012-10-15 135 views
0

我发现一个奇怪的行为,在一个自定义执行的ICommand接口我有RaiseCanExecuteChanged方法,可以从外部调用,并导致调用和reevalute方法和更改命令的状态(和按钮):CanExecuteChanged事件的奇怪行为

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属性。

任何人都可以解释这一点吗?谢谢。

回答

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); 
} 
+0

无论如何,WPF Control事件中不存在竞争条件。无论如何,每个事件都应在Dispatcher线程中触发并订阅/取消订阅。 –

1

我遇到了类似的问题。经过很多根本原因分析发现,我已经在MainPage.xaml页面中两次初始化了MainpageData Context。第二次初始化是在页面上的网格中偶然发生的。请检查这些类型的错误,因为CanExecuteChanged事件可能无法正确初始化