Khá muộn, nhưng tôi nghĩ điều này đủ khó để xứng đáng với nhiều góc độ khác nhau.
Tôi hiểu rằng tôi không muốn VM của tôi để biết về các Xem đính kèm, nhưng là nó hợp lý cho Xem để có một tài liệu tham khảo để VM của nó?
Như đã trả lời, sắp xếp ViewModel thích hợp liên quan đến ViewModel được chỉ định làm thuộc tính DataContext của Chế độ xem. Điều đó cho phép DataBindings được "automagically" thành lập từ XAML khai báo, hoặc tinh chỉnh thông qua mã phía sau.
Đôi khi, bạn sẽ bị cám dỗ để viết, trong mã của bạn phía sau, một cái gì đó như thế này:
var dc = DataContext as CleverViewModel;
CleverViewModel.CleverProperty.Add(someValue); // just a simple example
Tôi tin rằng cách thích hợp để đạt được điều này sắp xếp những thứ không phải là để đúc DataContext, nhưng thay vào đó:
có một số kiểm soát chuyên dụng trong View, ví dụ một ItemsControl với ItemsSource hai chiều databound của nó đối với một số tài sản trong viewmodel:
<ItemsSource x:Name="cleverControl" Visibility="Collapsed" ItemsSource="{Binding CleverProperty, Mode=TwoWay}"/>
Cast thuộc tính ràng buộc thay vì toàn bộ ViewModel, trong mã đằng sau:
var collection = (ObservableCollection<double>)cleverControl.ItemsSource; collection.Add(someValue);
Lưu ý sự khác biệt quan trọng: Cách tiếp cận thứ hai trong ví dụ này không yêu cầu Xem để biết loại ViewModel, nó chỉ cần một tài sản có tên CleverProperty
của loại ObservableCollection<double>
. Điều này cho phép tôi có chế độ ViewModels đa hình hoặc thậm chí là kiểu vịt.
Nếu một điều khiển trong một Xem mở một View (chẳng hạn như một hộp thoại) nên tôi xử lý này trong View? Có vẻ như sai khi xử lý nó trong VM từ thì VM có một số kiến thức về một Chế độ xem cụ thể.
Điều này không nên xảy ra trong MVVM nghiêm ngặt và không khó tránh sử dụng DataTemplates.DataTemplates ánh xạ một loại nhất định của DataContext để một loại nhất định của xem, do đó bất cứ lúc nào các DataContext của một thay đổi ContentControl, màn hình của nó cũng thay đổi, với điều kiện bạn có một DataTemplate cho loại đó:
Một điều khiển trong giao diện có thể gửi một lệnh tới ViewModel, do đó sẽ cập nhật một số thuộc tính của riêng nó, điều này sẽ được phản ánh theo chế độ xem.
Chế độ xem có thể chứa một Chế độ xem khác, ngoài kiến thức về Chế độ xem. Trong trường hợp này, mã phía sau có thể thao tác dữ liệu văn bản của chế độ xem được chứa.
Có nhiều sự tinh tế hơn, nhưng tôi đã sử dụng phương pháp này với kết quả tốt. Hy vọng điều này sẽ giúp một ai đó.
Chế độ xem tham chiếu đến máy ảo nhưng không được theo cách khác. http://stackoverflow.com/a/3670669/1977871 – VivekDev