使用MEFedMVVM概念从viewmodel访问视图?

时间:2013-01-21 13:51:42

标签: wpf mvvm prism mef mefedmvvm

MEFedMVVM视图模型中使用ViewModelLocator进行实例化。 MEFedMVVM非常强大,因为你的viewmodel可以有一个任意的构造函数:

[ExportViewModel("MyViewModel")]
public class MyViewModel : NotifyPropertyChangedBase
{
    [ImportingConstructor]
    public MyViewModel(IMediator mediator, IContainerStatus containerStatus, IDispatcherService dispatcherService)
    {
    }    
}

IMediatorIContainerStatusIDispatcherService是通过MEF实例化的服务接口。显然,如果需要,我可以创建自己的服务。

问题

当我的视图加载后,需要使用viewmodel中的数据为其子项的 readonly 属性分配一个成员。理想情况下,我会直接在XAML中绑定此变量,但我不能这样做,因为该属性是只读的,并且其成员不是可附加属性。目前,我有一个丑陋的解决方法:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var viewModel = DataContext as MyViewModel;
    this.child.SomeReadonlyProperty.Data = viewModel.MyData;
}

我想摆脱视图和视图模型的这种耦合。 MEFedMVVMPrism都提供了可能有用的不同模式,但我不知道使用哪种模式以及如何使用。是否可以让服务同时访问视图和视图模型?

问:我应该使用哪种模式来移除耦合?

1 个答案:

答案 0 :(得分:1)

我想我会倾向于创建一个视图可以实现的接口,它将描述设置属性所需的行为:

interface IMyView
{
    void SetReadOnlyProperty(object value);
}

然后,您可以在视图中创建SetReadOnlyProperty的实现,将视图导出为类型IMyView,最后在类型为IMyView的viewmodel上创建导入,这将导致您的方法并允许您从viewmodel执行调用。我相信这并不违背MVVM的精神,因为viewmodel不知道视图,它只是有一个接口,可以显示你需要的东西。