[英]Forcing Reevaluation on ICommand.CanExecute
在WPF XAML中,我具有Button
的Command
屬性,該屬性與實現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.