2011-07-05 66 views
8

我剛開始在應用程序中使用MVVM命令。我找到了很多示例,並在我的代碼中嘗試了兩種方法。一些實例有命令在XAML綁定像這樣:XAML中的命令綁定與ViewModel中的ICommand屬性

<CommandBinding Command="local:MainWindow.OpenRecentFile" 
       Executed="{Binding OpenRecentFile_Executed}" /> 
... 
<MenuItem Header="{x:Static culture:TextResource.RecentFilesMenuItem}" 
      Command="local:MainWindow.RecentFilesCommand" > 

隨着OpenRecentFile_Executed是在視圖模型的方法和靜態的ICommand像這樣:

public static readonly ICommand OpenRecentFile = 
    new RoutedCommand("Open Recent", typeof(MainWindow)); 

我還看到,其中有一個屬性上是類型的ICommand綁定到View像這樣的視圖模型:

<MenuItem Header="Close Current File" 
      Command="{Binding CloseCurrentFileCommand}" 
      CommandParameter="{TemplateBinding DataContext}"/> 

,並在視圖模型:

private ICommand closeCurrentFileCommand; 
public ICommand CloseCurrentFileCommand 
{ 
    get 
    { 
     if (closeCurrentFileCommand == null) 
     { 
      closeCurrentFileCommand = 
       new RelayCommand(param => this.CloseCurrentCedarFile(param)); 
     } 
     return closeCurrentFileCommand; 
    } 
} 

每種方法的優點/缺點是什麼?

回答

7

這取決於你的設計。如果你打算採用快速方法 - 一個帶有後端代碼的窗口,那麼在XAML中聲明命令可能會爲你節省一些時間並減少長期的工作量。

如果您打算使用MVVM應用程序,那麼我會強烈建議綁定到ICommand,因爲一般情況下命令都是操作數據(打開/保存/編輯)的方法,應該在ViewModel中定義。可能更多的努力取決於功能,但如果你正在做一個更大的應用程序,MVVM是一個很好的方法。

最後,兩者的工作原理是一樣的,但這是您的設計和方法。

5

我認爲這些的主要區別是路由性質的第一個版本。路由方面可以使命令對於某些場景更強大,但也會造成更多的痛苦。如果嘗試執行命令,但是目標ui元素沒有焦點,則痛苦可能會發揮作用。

基於屬性的ICommand實現將始終工作,因爲在命令調用和命令傳遞之間沒有「路由」步驟。

我傾向於使用大多數基於屬性的命令,除非我的方案需要路由優惠的功能。

相關問題