2009-12-15 23 views
6

Tôi đang làm việc trên một ứng dụng WPF và tôi hiểu mẫu lệnh khá tốt, nhưng tôi đã tìm thấy rằng có một số triển khai khác nhau của mẫu lệnh cho MVVM. Có sự thực hiện của Josh Smith trong ứng dụng mẫu WPF của ông, số DelegateCommand từ lăng kính và việc thực hiện CommandBindings.Mẫu được chấp nhận cho lệnh WPF trong MVVM là gì?

Câu hỏi của tôi là, thực tiễn tốt nhất được chấp nhận chung để sử dụng lệnh với MVVM là gì? Ứng dụng của tôi sử dụng Prism để DelegateCommand có sẵn cho chúng tôi.

Các nhà phát triển trong nhóm của tôi đang tranh cãi về cách tiếp cận nào là "tốt nhất". Một số không thích nhiều tệp .cs được tạo cho mỗi lệnh, những người khác thích mọi thứ được kết nối qua CommandBindings. Tôi đang thua lỗ. Có ai có thể làm sáng tỏ không?

Trả lời

2

Hai điểm cần cân nhắc:

Các lệnh được cung cấp bởi các khuôn khổ MVVM khác nhau, chẳng hạn như CommandSinkCommand hoặc SimpleCommand (từ Cinch) vv làm việc như bình thường ICommands làm. Đặc biệt, trình xử lý CanExecute được đánh giá bất cứ khi nào WPF tin rằng có điều gì đó đã xảy ra, điều này có thể gây ra thay đổi giao diện người dùng. Bạn cũng có thể buộc thủ công thông qua CommandManager.InvalidateRequerySuggested().

Ngược lại, DelegateCommands <> của Prism không gọi trình xử lý CanExecute trừ khi bạn gọi thủ công RaiseCanExecuteChanged() trên lệnh. Nếu bạn muốn thay đổi điều này nên nó cũng được kích hoạt khi các lệnh thường được requeried, xem mã tại http://compositewpf.codeplex.com/Thread/View.aspx?ThreadId=47338

EDIT:

điểm thứ hai: Các lệnh của khung MVVM thường chấp nhận một đối tượng như tham số lệnh. Ngược lại, các DelegateCommands <> của Prism được đánh mạnh mẽ hơn (mặc dù bạn có thể tất nhiên có một DelegateCommands nếu bạn muốn).

+0

Tôi đã chuyển câu trả lời được chấp nhận cho bạn vì đoạn thứ hai tuyệt vời. Cảm ơn các đầu vào! –

+0

Ngoài ra hãy xem MVVMLights RelayCommand rất giống với Lệnh đại biểu. – Agies

3

Vâng - tôi nghĩ rằng không có giải pháp.

Các CommandBindings không thể kiểm chứng dễ dàng và giới thiệu một sự phụ thuộc vào các lớp WPF trong ViewModel mà không phải là rất tốt. Vì vậy, tôi sẽ không sử dụng chúng.

Cả DelegateCommand và CommandSinkCommand (giải pháp của Josh Smith) là những cách hay IMO. Họ không thực sự khác nhau và không ai trong số họ là cấp trên khác. Mặc dù, tôi nhận thấy rằng phiên bản CommandSink không hoạt động khi lệnh định tuyến trở nên phức tạp hơn (đặc biệt khi DataTemplates có liên quan).

Bạn thậm chí có thể kết hợp chúng: Sử dụng DelegateCommand và sử dụng thêm phiên bản JoshSmith - vì vậy bạn có thể kết hợp các ưu điểm của cả hai. Điều duy nhất bạn cần là một số lớp trợ giúp - không thực sự khó thực hiện.

Quan trọng hơn nhiều là sự phù hợp trong đơn đăng ký của bạn: Nếu bạn quyết định điều bạn muốn sử dụng, bạn nên làm theo cách này thông qua toàn bộ đơn đăng ký của mình.

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