【发布时间】:2012-04-26 08:57:32
【问题描述】:
我正在使用 MEF 和名为 MEFedMVVM 的第三方库编写 WPF 应用程序。
我正在尝试创建一个设计,其中父视图模型具有一组子视图模型,并且我希望使用视图模型优先的方法,因为这将视图保留在视图模型之外,从而使代码更多查看以模型为中心且更可单元测试的视图。
我已阅读 this discussion 和 this discussion 关于将 DataTemplate 用于视图的内容,以及 Reed Copsy, Jr 的建议 here 使用通用视图来查看模型映射资源。但是,我很难真正实现一些有效的东西。
我的父视图很简单:
<UserControl x:Class="MyParentView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:meffed="clr-namespace:MEFedMVVM.ViewModelLocator;assembly=MEFedMVVM.WPF"
meffed:ViewModelLocator.ViewModel="MyParentViewModel" />
父视图模型派生自实现IContextAware的基本类型:
[ExportViewModel("MyParentViewModel")]
public class MyParentViewModel : ViewModelBase
{
[ImportingConstructor]
public MyParentViewModel()
{
var myChildVM = ServiceLocator.Current.GetInstance<MyChildViewModel>());
}
}
这是子视图模型:
[Export(typeof(MyChildViewModel))]
[ExportViewModel("MyChildViewModel", true)]
public class MyChildViewModel : ViewModelBase
{
}
这有一个对应的视图:
<UserControl x:Class="MyChildView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:meffed="clr-namespace:MEFedMVVM.ViewModelLocator;assembly=MEFedMVVM.WPF"
meffed:ViewModelLocator.ViewModel="MyChildViewModel" />
最初,我认为在 MyChildViewModel 的 ExportViewModel 属性上指定第二个布尔参数将使所有工作都使用视图模型优先的方法作为我的视图和视图模型在视图的 XAML 代码中一起使用 MEF。然而,事实并非如此,当我在 MyParentViewModel 构造函数是一个 MyParentView 对象。不是我期待和希望的 MyChildView 对象。显然,我需要添加一些东西来将它们连接在一起。谁能提供一个如何做到这一点的例子?
谢谢!
【问题讨论】:
-
您使用 ServiceLocator 获取子 VM 是否有原因?为什么不加入 MEF?
-
为什么
MyChildView指定ViewModel="MyParentViewModel"? -
感谢 jberger,愚蠢的错字 - 已更正。
-
您的
MyParentView.xaml.cs和MyChildView.xaml.cs文件是什么样的? -
除了默认构造函数中的 InitializeComponent() 调用之外为空。
标签: wpf mef datatemplate mefedmvvm