簡體   English   中英

強制對ICommand.CanExecute進行重新評估

[英]Forcing Reevaluation on ICommand.CanExecute

在WPF XAML中,我具有ButtonCommand屬性,該屬性與實現ICommand的類的實現一起使用。

在此實現中,我沒有連接CanExecuteChanged事件以使用CommandManager.RequerySuggested我想控制何時調用CanExecute,並且使用此調用的次數比必要的多。

我可以獲得ICommand.CanExecute進行重新評估的唯一其他方法是使用類似以下內容的方法:

public void InvokeCanExecute()
{
    CanExecuteChanged.Invoke(this, new EventArgs());
}

在我的類中實現ICommand

這看起來真的很討厭-我是否缺少明顯的東西? 我嘗試使用PropertyChanged調用重新評估,但這似乎不起作用。

不,您並沒有真正錯過任何東西。 這是一個類似的問題,建議您采用相同的方法: CanExecuteChanged和CommandManager.RequerySuggested的實際任務是什么?

不過,您可以使方法更加健壯:

public void InvokeCanExecute()
{
    var handler = CanExecuteChanged;
    if (handler != null)
    {
        handler(this, new EventArgs());
    }
}

的確是這樣-如果您不想使用CommandManager.RequerySuggested ,它的確可能會比必要的調用CanExecute更高-您需要顯式調用自己的InvokeCanExecute方法,以強制命令重新評估其CanExecute條件。

但是,在大多數情況下, CanExecute條件將取決於公共(可綁定)屬性,這意味着引發PropertyChanged事件以指示其值已更改的PropertyChanged -可以掛接到此事件,以便在InvokeCanExecute任何一種情況下自動調用InvokeCanExecute命令所依賴的屬性已更改。 有關如何實現命令的示例,請參見此人的博客文章 (如果我沒記錯的話,例如,作為MVVM Light工具包的一部分,實現了這種方法)。

使用這種方法實例化命令看起來類似於以下內容:

SaveCommand = new RelayCommand(() => { /* do some stuff; */ }, 
                               () => !string.IsNullOrEmpty(Name), 
                               this, () => Name);

由於命令的CanExecute條件(檢查Name是否為空)取決於Name屬性,因此只要Name的內容更改,就需要重新評估該條件。 您只需將對Name屬性的引用傳遞給命令的構造函數,並且只要Name的值更改, InvokeCanExecute將自動被調用。

從理論上講,可以更進一步,讓命令本身檢查依賴於哪些屬性-如果您對此方法感興趣,請參閱我的博客文章之一 ,但請注意,這一內容很大程度上取決於反射,因此這種方法是否可行始終取決於詳細的用例。 該解決方案的示例實現包含在MVVMbasics框架中 (免責聲明:由我發布)。 在這種情況下,您可以將命令初始化代碼減少為:

SaveCommand = CreateRelayCommand(() => { /* do some stuff; */ }, 
                                () => !string.IsNullOrEmpty(Name));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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