Sco*_*ock 24 wpf mef datatemplate mvvm
我把MEF看成是一个可扩展性框架,除了一点之外我几乎卖得很多:
假设我要导入ViewModel和View来显示它.我认为这样做的"正确"方法是MEF部分导出ViewModel类,以及显示ViewModel的DataTemplate.例如,假设您正在构建类似Visio的应用程序,并且您想要导入形状库.每个形状都需要在Xaml中定义的View和一个将包装一些底层Model对象的ViewModel.
这可能吗?DataTemplate的Import合约会是什么样的?如何让WPF知道导入的DataTemplate?
Sco*_*ock 39
是的,我能够通过以下方式完成这项工作:
在我的主机WPF应用程序中,我添加了这个导入:
[ImportMany("ApplicationResources", typeof(ResourceDictionary))]
public IEnumerable<ResourceDictionary> Views { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后在我的复合部分中,我在常规ResourceDictionary Xaml文件中声明了ViewModel和ViewModel的数据模板.然后我为ResourceDictionary创建了一个代码,就像这样(在这个例子中,ViewModel被称为ItemViewModel而ResourceDictionary被称为ItemView):
[Export("ApplicationResources", typeof(ResourceDictionary))]
public partial class ItemView : ResourceDictionary
{
public ItemView()
{
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
作为参考,示例ResourceDictionary的Xaml如下所示:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyCompany.MyProduct"
x:Class="MyCompany.MyProduct.ItemView">
<DataTemplate DataType="{x:Type local:ItemViewModel}">
...
</DataTemplate>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
然后,回到我的主机WPF应用程序,在我成功编写之后,在我显示主窗口之前,我这样做:
// Add the imported resource dictionaries
// to the application resources
foreach (ResourceDictionary r in Views)
{
this.Resources.MergedDictionaries.Add(r);
}
Run Code Online (Sandbox Code Playgroud)
这似乎成功地在WPF看到ItemViewModel的任何地方应用DataTemplate.
编辑:对于任何感兴趣的人,我发布了一个名为SoapBox Core的应用程序框架作为开源,它广泛使用这种方法将Views导入应用程序资源.它工作得很好,您可以自己下载源代码并查看它的工作原理.
归档时间: |
|
查看次数: |
6792 次 |
最近记录: |