2012-10-15 128 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事件可能無法正確初始化