0

MEFedMVVM视图模型中使用ViewModelLocator. MEFedMVVM非常强大,因为您可以为视图模型使用任意构造函数:

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

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

问题

当我的视图已加载时,它需要为其子级只读属性之一的成员分配来自视图模型的数据。理想情况下,我会直接将此变量绑定到 中XAML,但我不能这样做,因为该属性是只读的并且它的成员不是可附加属性。目前,我有一个丑陋的解决方法:

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

我想摆脱视图和视图模型的这种耦合。两者都MEFedMVVM提供Prism可能有用的不同模式,但我不知道该使用哪个 - 以及如何使用。可以让服务同时访问视图和视图模型吗?

问:我应该使用什么模式来移除联轴器?

4

1 回答 1

1

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

interface IMyView
{
    void SetReadOnlyProperty(object value);
}

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

于 2013-01-27T21:41:30.890 回答