簡體   English   中英

XAML 中的命令綁定與 ViewModel 中的 ICommand 屬性

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

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