2010-09-08 23 views
9

Trong mẫu MVVM (Model-View-ViewModel) nên ViewModel tham chiếu chế độ xem. Tôi nghĩ rằng nó không nên. Nhưng kịch bản sau đây nên được handeled như thế nào? Tôi có chế độ xem có điều khiển tab làm vùng chứa chính, khung nhìn cho chế độ xem này thực hiện lệnh để thêm tab mới vào điều khiển tab. Cách dễ dàng là để cho phép viewmodel tham chiếu khung nhìn và sau đó trong thực hiện lệnh để chỉ cần thêm tab mới vào tabcontrol trong khung nhìn. Điều này có vẻ sai. Tôi có nên bằng cách nào đó ràng buộc các tabcontrol để viewmodel và sau đó thực hiện một dữ liệu/kiểm soát mẫu để thêm các tab mới. Tôi hy vọng điều này có ý nghĩa với ai đó :)Một ViewModel trong MVVM có tham chiếu Chế độ xem không?

Trả lời

7

Reed và Dan bao hàm cách tiếp cận chung nhưng liên quan đến trường hợp cụ thể của bạn, TabControl là một ItemsControl và do đó có thể ràng buộc ItemsSource của nó vào một bộ sưu tập dữ liệu trong ViewModel của bạn đại diện cho tập hợp các tab để hiển thị. Giao diện người dùng cho mỗi loại tab sau đó có thể được đại diện bởi một DataTemplate cụ thể cho kiểu dữ liệu của một mục (hoặc bằng cách sử dụng DataType hoặc một DataTemplateSelector). Sau đó bạn có thể thêm hoặc loại bỏ các mục dữ liệu khi cần thiết từ máy ảo của bạn và có các tab cập nhật tự động mà không có VM biết gì về TabControl.

+0

Tất cả các câu trả lời khác đều tốt. Điều này chỉ bao gồm những gì tôi muốn làm đặc biệt. Tôi thậm chí còn tìm thấy một cách để thiết lập mục đã chọn trong mô hình khung nhìn mà không tham chiếu khung nhìn thông qua một thuộc tính trên máy ảo của tôi bị ràng buộc với mô hình lastAdded trong bộ sưu tập của tôi. Rât gọn gang ... – Johan

3

Tôi thấy rằng thường là một sự thỏa hiệp hữu ích để hiển thị giao diện trên Chế độ xem xử lý chức năng của Chế độ xem cụ thể. Đây là một cách tốt để xử lý những thứ khó xử lý với ràng buộc thuần túy, như hướng dẫn biểu mẫu đóng, mở hộp thoại tệp (mặc dù thường được đưa vào giao diện dịch vụ riêng của nó) hoặc tương tác với các điều khiển không được thiết kế tốt cho dữ liệu ràng buộc (chẳng hạn như ví dụ bạn đã cung cấp.)

Sử dụng giao diện vẫn giữ Chế độ xem và ViewModel được tách riêng phần lớn và cho phép bạn giả lập IView cụ thể trong khi thử nghiệm.

10

Trong MVVM "thuần túy", ViewModel không thực sự tham chiếu Chế độ xem. Tuy nhiên, nó thường thuận tiện, để cung cấp một số dạng giao diện trong View, nhờ đó ViewModel có thể tương tác với nó.

Tuy nhiên, tôi đã thấy rằng tôi gần như không bao giờ làm điều đó nữa. Phương pháp thay thế là sử dụng một số hình thức attached property hoặc hành vi pha trộn trong Chế độ xem của bạn và liên kết nó với thuộc tính ViewModel của bạn. Điều này cho phép bạn giữ logic Xem 100% trong Chế độ xem. Ngoài ra, bằng cách tạo hành vi cho điều này, bạn tạo một loại có thể sử dụng lại có thể được sử dụng để xử lý điều này trong mọi tương tác ViewModel-> Xem. Tôi mạnh mẽ thích cách tiếp cận này hơn có bất kỳ logic Xem nào trong ViewModel.

Để chứng minh kỹ thuật này, tôi đã viết một mẫu cho Bộ sưu tập mã biểu thức có tên là WindowCloseBehavior. Nó minh họa cách bạn có thể sử dụng Hành vi trong Chế độ xem được gắn với thuộc tính trong ViewModel để xử lý việc kiểm soát vòng đời của Window, bao gồm ngăn không cho đóng cửa sổ, v.v.

0

Một người trong chúng ta thiếu điều gì đó hiển nhiên. Kiểm soát tab của bạn là một ItemsControl. Bạn nên liên kết các ItemsSource của điều khiển tab của bạn với một bộ sưu tập ovservable trong mô hình xem của bạn. Khi bạn xử lý lệnh trong mô hình khung nhìn của mình để thêm một tab, bạn chỉ cần thêm một phần tử mới vào bộ sưu tập này và, thì đấy, bạn đã thêm một tab mới vào điều khiển.

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