2011-07-05 60 views
8

Tôi chỉ mới bắt đầu sử dụng lệnh với MVVM trong một ứng dụng. Tôi đã tìm thấy một số ví dụ và đã thử cả hai cách trong mã của tôi. Một số ví dụ có lệnh ràng buộc trong XAML như vậy:Lệnh Binding trong XAML vs Thuộc tính ICommand trong ViewModel

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

Với OpenRecentFile_Executed là một phương pháp trong ViewModel và một ICommand tĩnh như vậy:

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

Tôi cũng đã thấy, nơi có một tài sản trên ViewModel đó là loại ICommand đó là ràng buộc để trong Xem như vậy:

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

và trong ViewModel:

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

Lợi ích/hạn chế đối với mỗi phương pháp là gì?

Trả lời

7

Tùy thuộc vào thiết kế của bạn. Nếu bạn đang đi cho các phương pháp tiếp cận nhanh chóng - một cửa sổ với mã back-end sau đó tuyên bố các lệnh trong XAML có thể sẽ giúp bạn tiết kiệm một số thời gian và giảm nỗ lực trong thời gian dài.

Nếu bạn đang đi cho một ứng dụng MVVM thì tôi sẽ đề nghị ràng buộc với ICommand như lệnh nói chung là cách để thao tác dữ liệu của bạn (mở/lưu/chỉnh sửa) và điều này nên được xác định trong ViewModel. Có thể nhiều nỗ lực phụ thuộc vào chức năng nhưng MVVM là một cách tuyệt vời để đi nếu bạn đang làm một ứng dụng lớn hơn.

Cuối cùng cả hai sẽ hoạt động giống nhau nhưng đó là thiết kế và cách tiếp cận của bạn quan trọng.

5

Tôi nghĩ rằng sự khác biệt chính giữa chúng là được định tuyến bản chất của phiên bản đầu tiên. Các khía cạnh định tuyến có thể làm cho lệnh mạnh mẽ hơn cho một số kịch bản, nhưng nó cũng có thể gây ra một số cơn đau nhiều hơn nữa. Cơn đau có thể xảy ra nếu bạn cố gắng thực hiện lệnh, nhưng phần tử ui đích không tập trung.

Tính năng triển khai ICommand dựa trên thuộc tính sẽ luôn hoạt động vì không có bước "định tuyến" giữa lời gọi lệnh và gửi lệnh.

Tôi có xu hướng sử dụng hầu hết các lệnh dựa trên thuộc tính trừ khi kịch bản của tôi gọi cho các tính năng định tuyến cung cấp.

Các vấn đề liên quan