Tôi thường xử lý việc này bằng cách tạo một số loại WindowViewLoaderService. Khi chương trình của bạn khởi bạn đăng ký của Window và ViewModels của bạn với mã một cái gì đó như thế này:
WindowViewLoaderService.Register(TypeOf(MainWindowView), TypeOf(MainWindowViewModel);
WindowViewLoaderService.Register(TypeOf(MyWindowView), TypeOf(MyWindowViewModel);
Sau đó, khi bạn có thể ví dụ gọi vào dịch vụ này từ ViewModel của bạn và tất cả các bạn phải tham khảo là ViewModel khác của bạn. Ví dụ, nếu bạn đang ở trong MainWindowViewModel của bạn, bạn có thể có mã như thế này:
var myChildWindowVM = new MyWindowViewModel();
WindowViewLoaderService.ShowWindow(myChildWindowVM)
Các WindowViewLoaderService sau đó sẽ tìm kiếm những gì Xem được kết hợp với ViewModel định bạn thông qua nó. Nó sẽ tạo ra View đó, thiết lập DataContext của nó tới ViewModel mà bạn đã truyền vào, và sau đó hiển thị View.
Bằng cách này, Chế độ xem của bạn không bao giờ biết về bất kỳ Chế độ xem nào.
Bạn có thể cuộn một trong các dịch vụ của riêng mình một cách dễ dàng. Tất cả những gì cần làm là giữ một từ điển với khóa là ViewModelType của bạn và giá trị là ViewType của bạn. Phương thức Register bổ sung vào từ điển của bạn và phương thức ShowWindow tra cứu khung nhìn chính xác dựa trên ViewModel được truyền vào, tạo khung nhìn, thiết lập DataContext, và sau đó gọi Show trên đó.
Hầu hết các khung MVVM cung cấp một cái gì đó như thế này cho bạn ra khỏi hộp. Ví dụ, Caliburn có một cái slick chỉ sử dụng quy ước đặt tên được gọi là ViewLocator trong khung công tác này. Dưới đây là một liên kết mà tóm tắt: http://devlicio.us/blogs/rob_eisenberg/archive/2010/07/04/mvvm-study-segue-introducing-caliburn-micro.aspx
Cinch mặt khác gọi đó là một WPFUIVisualizerService mà bạn có thể nhìn thấy trong hành động ở đây: http://www.codeproject.com/KB/WPF/CinchIII.aspx
Những sẽ giúp bạn có được lăn.
Nguồn
2011-05-06 21:12:30
Tôi không đồng ý rằng Xem mã phía sau tệp "phải trống". Mặc dù có rất nhiều điều KHÔNG nên ở trong mã đằng sau nó vẫn có giá trị. Tôi sử dụng nó cho bất cứ điều gì cụ thể cho lớp Xem, chẳng hạn như quản lý Focus điều khiển. Tôi cũng sử dụng nó để mở Windows tiếp theo trong WPF. –
+1 cho Joel. Triển khai MVVM có nghĩa là mã VIEW SPECIFIC là mã CHỈ phải nằm trong mã phía sau. ViewModel của bạn không nên xử lý những thứ như thay đổi trạng thái của VSM (trừ khi, có lẽ, những thay đổi này được điều khiển dữ liệu, trong trường hợp này tôi sẽ bọc nó trong một hành vi hoặc trình kích hoạt tiếp xúc ở cấp VM) –
Cảm ơn ý kiến của bạn. .. họ đã thực sự xóa một số thứ cho tôi. – Sheridan