2011-01-04 9 views
5

Tôi vừa bắt đầu thử nghiệm với số MVVM Light Toolkit của Laurent Bugnion. Tôi nghĩ rằng tôi sẽ thực sự thích nó, nhưng tôi có một vài câu hỏi.Bộ công cụ ánh sáng MVVM - RelayCommands, DelegateCommands và ObservableObjects

Trước khi tôi đến với họ, hãy để tôi giải thích tôi đến từ đâu. Tôi hiện đang sử dụng kết hợp của MVVM Foundation của Josh Smith và một dự án khác trên Codeplex có tên là MVVM Toolkit. Tôi sử dụng ObservableObjectMessenger từ MVVM Foundation và DelegateCommandCommandReference từ Bộ công cụ MVVM.

duy nhất chồng chéo thực sự giữa MVVM Foundation và MVVM Toolkit là họ đều có một thực hiện cho ICommand: MVVM Foundation có RelayCommand và MVVM Toolkit có DelegateCommand. Trong số này, DelegateCommand dường như tinh vi hơn. Nó sử dụng một CommandManagerHelper sử dụng tham chiếu yếu để tránh rò rỉ bộ nhớ.

Với những gì đã nói, đây là những câu hỏi của tôi:

  1. Tại sao MVVM Ánh sáng sử dụng RelayCommand hơn DelegateCommand? Việc sử dụng tài liệu tham khảo yếu trong một số ICommand không cần thiết hay không được khuyến cáo vì một số lý do?

  2. Tại sao không có ObservableObject trong MVVM Light? ObservableObject về cơ bản chỉ là một phần của ViewModelBase thực hiện INotifyPropertyChanged, nhưng rất thuận tiện để có một lớp riêng biệt vì các kiểu xem không phải là các đối tượng duy nhất cần triển khai INotifyPropertyChanged. Ví dụ: giả sử bạn có DataGrid liên kết với danh sách các đối tượng Person. Nếu bất kỳ thuộc tính nào trong Person có thể thay đổi trong khi người dùng đang xem DataGrid, Person cần phải triển khai INotifyPropertyChanged. (Tôi nhận ra rằng nếu Person được tạo tự động bằng cách sử dụng một cái gì đó giống như LinqToSql, có thể nó đã thực hiện INotifyPropertyChanged, nhưng có trường hợp tôi cần phải tạo phiên bản cụ thể cho các đối tượng mô hình thực thể, vì tôi cần bao gồm một lệnh hỗ trợ cột nút trong DataGrid.)

Cảm ơn.

P.S. Dưới đây là mã cho DelegateCommand từ MVVM Toolkit:

https://docs.google.com/document/pub?id=1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU

Trả lời

4

Dường như các vấn đề nêu ra bởi câu hỏi đầu tiên đã được giải quyết trong phiên bản mới nhất:

Theo The MVVM Light Toolkit Codeplex site (dưới "Nâng cao sự kiện CanExecuteChanged bằng tay"), các CommandManager đã được loại bỏ hoàn toàn.

Đối với Observable Object, tôi đã thêm an item to the Issue Tracker trên trang web Codeplex.

+0

'ObservableObject' cũng đã được triển khai. – devuxer

0

Cả hai câu hỏi của bạn đề nghị với tôi rằng bạn thích sử dụng một cái gì đó hơn hơn khái niệm Xem các mẫu để xác định logic kinh doanh.

DelegateCommand xác định riêng biệt khác với Mô hình xem. ObservableObject là phiên bản của lớp riêng biệt ngoài Mô hình xem. Đây không phải là quy tắc mà là sở thích cá nhân của thời điểm: Mô hình Xem đủ cho tôi như một vùng chứa cho logic nghiệp vụ, liên quan đến hình ảnh. Điều này có thể phản bội sở thích của tôi cho MVVM Light --- mà tôi không thấy thiếu tại thời điểm này.

Tôi không chắc chắn về những gì đang diễn ra trong ví dụ DataGrid. Những gì tôi có thể nói là DataGrid không phải là rất linh hoạt --- tuy nhiên, trong WPF, các DataGridTemplateColumn có thể tuyên bố ràng buộc một View Model để xem (ví dụ như một điều khiển người dùng).Vì vậy, có lẽ điều này có ý nghĩa:

<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate DataView="{x:Type m:YourViewModelForButton}"> 
     <v:YourViewWithButton/> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 
+0

'RelayCommand' cũng là một lớp riêng biệt. Vì vậy, là 'ViewModelBase'. Đối với ví dụ DataGrid của tôi, nó có thể chỉ là vấn đề của thuật ngữ. Tôi nghĩ về * view-models * trong MVVM như một cái gì đó bạn liên kết với Views thông qua DataContext. Nhưng tôi cũng nghĩ rằng bạn có thể có các mô hình xem cho các đối tượng miền (tức là các thực thể). Ví dụ, 'Person' có thể có thuộc tính' DateOfBirth'. 'PersonViewModel' có thể có các thuộc tính bổ sung, như' Age', 'IsSelected' (để sử dụng với cột hộp kiểm DataGrid), và' ToggleSelectionCommand' (để sử dụng với cột nút DataGrid). – devuxer

+0

@DanM Thông thường các đối tượng miền của tôi là một phần của khung nhìn. Ví dụ trong trường hợp của bạn tôi sẽ có một icollection , selectedPerson tài sản, sau đó tôi sẽ có các thuộc tính của người như là tài sản riêng biệt ràng buộc với các lựa chọnPerson. – ecathell

0

Bạn cũng có thể xem xét Catel. Nó hỗ trợ một DataObject (cả hai chung chung và không chung chung) hỗ trợ chính xác những gì bạn đang tìm kiếm (một đối tượng thực hiện INotifyPropertyChanged, IDataErrorInfo, và nhiều hơn nữa). Sau đó, ViewModelBase có nguồn gốc từ lớp DataObjectBase rất mạnh, vì vậy bạn có thể sử dụng DataObjectBase cho các đối tượng dữ liệu và ViewModelBase cho các mô hình khung nhìn.

Nó cũng giúp bạn tiết kiệm từ việc tạo sứ giả vì bạn chỉ có thể sử dụng thuộc tính Quan tâm trên mô hình xem để nhận thông báo thay đổi của mô hình chế độ xem khác.