[英]Command Binding in XAML vs ICommand Properties in ViewModel
我剛剛開始在應用程序中使用 MVVM 命令。 我找到了許多示例,並在我的代碼中嘗試了兩種方式。 一些示例在 xaml 中具有命令綁定,如下所示:
<CommandBinding Command="local:MainWindow.OpenRecentFile"
Executed="{Binding OpenRecentFile_Executed}" />
...
<MenuItem Header="{x:Static culture:TextResource.RecentFilesMenuItem}"
Command="local:MainWindow.RecentFilesCommand" >
使用 OpenRecentFile_Executed 作為 ViewModel 中的方法和 static ICommand 如下所示:
public static readonly ICommand OpenRecentFile =
new RoutedCommand("Open Recent", typeof(MainWindow));
我還看到 ViewModel 上有一個 ICommand 類型的屬性,該屬性綁定到 View 中,如下所示:
<MenuItem Header="Close Current File"
Command="{Binding CloseCurrentFileCommand}"
CommandParameter="{TemplateBinding DataContext}"/>
在 ViewModel 中:
private ICommand closeCurrentFileCommand;
public ICommand CloseCurrentFileCommand
{
get
{
if (closeCurrentFileCommand == null)
{
closeCurrentFileCommand =
new RelayCommand(param => this.CloseCurrentCedarFile(param));
}
return closeCurrentFileCommand;
}
}
每種方法的優點/缺點是什么?
這取決於您的設計。 如果您要采用快速方法 - 帶有后端代碼的 Window 然后在 XAML 中聲明命令可能會為您節省一些時間並從長遠來看減少工作量。
如果您要使用 MVVM 應用程序,那么我強烈建議綁定到 ICommand,因為命令通常是操作數據(打開/保存/編輯)的方法,這應該在 ViewModel 中定義。 可能更多的努力取決於功能,但如果您正在執行更大的應用程序,MVVM 是 go 的好方法。
最后,兩者都將起作用,但重要的是您的設計和方法。
我認為這些之間的主要區別是第一個版本的路由性質。 路由方面可以讓命令在某些場景下更加強大,但也會帶來更多的痛苦。 如果您試圖讓命令執行,但目標 ui 元素沒有焦點,那么痛苦可能會發揮作用。
基於屬性的 ICommand 實現將始終有效,因為在命令調用和命令傳遞之間沒有“路由”步驟。
我傾向於主要使用基於屬性的命令,除非我的場景需要路由提供的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.