在MEFedMVVM
视图模型中使用ViewModelLocator
进行实例化。 MEFedMVVM
非常强大,因为你的viewmodel可以有一个任意的构造函数:
[ExportViewModel("MyViewModel")]
public class MyViewModel : NotifyPropertyChangedBase
{
[ImportingConstructor]
public MyViewModel(IMediator mediator, IContainerStatus containerStatus, IDispatcherService dispatcherService)
{
}
}
IMediator
,IContainerStatus
和IDispatcherService
是通过MEF
实例化的服务接口。显然,如果需要,我可以创建自己的服务。
当我的视图加载后,需要使用viewmodel中的数据为其子项的 readonly 属性分配一个成员。理想情况下,我会直接在XAML
中绑定此变量,但我不能这样做,因为该属性是只读的,并且其成员不是可附加属性。目前,我有一个丑陋的解决方法:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var viewModel = DataContext as MyViewModel;
this.child.SomeReadonlyProperty.Data = viewModel.MyData;
}
我想摆脱视图和视图模型的这种耦合。 MEFedMVVM
和Prism
都提供了可能有用的不同模式,但我不知道使用哪种模式以及如何使用。是否可以让服务同时访问视图和视图模型?
问:我应该使用哪种模式来移除耦合?
答案 0 :(得分:1)
我想我会倾向于创建一个视图可以实现的接口,它将描述设置属性所需的行为:
interface IMyView
{
void SetReadOnlyProperty(object value);
}
然后,您可以在视图中创建SetReadOnlyProperty
的实现,将视图导出为类型IMyView
,最后在类型为IMyView
的viewmodel上创建导入,这将导致您的方法并允许您从viewmodel执行调用。我相信这并不违背MVVM的精神,因为viewmodel不知道视图,它只是有一个接口,可以显示你需要的东西。