[英]How to requery 'CanExecute' of a single RoutedCommand?
我需要刷新一個或多個(盡管不是全部) RoutedCommand
對象的CanExecute
狀態。
我知道您可以使用更新所有命令
CommandManager.InvalidateRequerySuggested();
由於這會更新遠遠超過必要的命令,因此在我的應用程序中調用此函數有時會出現性能問題。
我最初的希望是,如果狀態發生變化,手動調用CanExecute()
也會引發事件,但事實並非如此。
在查看引用源時, CanExecuteChanged
似乎不能被派生類訪問,以便為允許手動引發事件的RoutedCommand
類提供某種擴展。
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
我有什么想法可以實現這樣的機制? 我知道DelegateCommand
,但我需要一個路由命令,所以我認為這個課程不能幫助我。
您可以創建自己的自定義RoutedCommand
,重新實現ICommand
並自行注冊其他活動。 請注意,使用new
在這里應該是安全的,因為WPF將使用ICommand
引用來調用CanExecuteChanged
。
public class MyRoutedCommand : RoutedCommand, ICommand
{
private event EventHandler _canExecuteChanged;
public void RaiseCanExecuteChanged()
{
var handler = _canExecuteChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public new event EventHandler CanExecuteChanged
{
add
{
_canExecuteChanged += value;
base.CanExecuteChanged += value;
}
remove
{
_canExecuteChanged -= value;
base.CanExecuteChanged -= value;
}
}
}
您應該知道,雖然WPF將使用WeakEventManager
注冊此事件,但其他開發人員可能不會。 由於路由命令通常被定義為靜態字段,因此這可能是潛在的內存泄漏。 您可以實現一個弱事件管理器來防止這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.