簡體   English   中英

如何重新查詢單個RoutedCommand的'CanExecute'?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM