我做了一些自定義的ICommand實現我自己的,我看到的實現會像這樣的很多:爲什麼人們在ICommands上使用CommandManager.InvalidateRequerySuggested()?
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
protected void RaiseCanExecuteChanged()
{
CommandManager.InvalidateRequerySuggested();
}
至於我可以看到,因爲調用RaiseCanExecuteChanged()
將觸發所有的命令,這是優化不好的代碼用戶界面來檢查他們的ICommand.CanExecute
狀態,通常我們只是想讓他們中的一個來驗證它。
我想我讀了一次,這是一些WPF ICommands的主代碼,比如RoutedCommand
,對他們來說它是有道理的,因爲他們想要一旦某個控件失去焦點和像這樣的事情時自動重新驗證所有ICommands,不明白爲什麼人們將自己的模式重複用於他們自己的ICommand
實現。
我心目中的代碼是一個簡單的事件調用,如:
public event EventHandler CanExecuteChanged;
protected void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
我測試,一切正常,所以爲什麼所有的網絡上的例子沒有實現這麼簡單的東西嗎?我錯過了什麼嗎?
我已閱讀有關使用視圖被垃圾收集在定期活動,其中CommandManager
只使用WeakReferences
,這是很好的情況下,強引用的內存泄漏問題,但儘管如此,不存在贏得任何解決方案」在性能上超越內存佔用?
http://stackoverflow.com/questions/2281566/is-josh-smiths-implementation-of-the-relaycommand-flawed – ASh