如何在Prism中使用DataTemplates

时间:2010-02-11 13:45:58

标签: wpf dependency-injection prism datatemplate

我一直在使用Prism一段时间,并且享受分离我的模块更容易。

这对视图和视图模型特别有用,因为您可以通过接口注入视图模型,并通过区域管理器注入视图。

不幸的是,这只适用于我的观点是完整的用户控件,除非我在这里遗漏了一些东西(我真诚地希望我是这样)。

很多时候,我会创建一个ViewModel和一个匹配的DataTemplate。然后,其他程序集可以使用它们来组成视图。

我的问题是,在没有引用包含程序集的情况下,我看不到引用这些datatemplates的方法,所以在我的xaml文件中我写了类似的东西:

<ResourceDictionary Source="pack://application:,,/......>

当然,这并没有真正解耦,尽管我试图确保,我没有在代码中的任何其他位置引用程序集。

我想到的另一个解决方案是将datatemplates放入Infrastructure项目中,但我也不太喜欢,因为我希望包含属于模块的所有内容(当然除了接口) )。

那么,有没有人有一个好的解决方法,或者我是否错过了一些Prism功能?

2 个答案:

答案 0 :(得分:4)

我建议创建一个封装将资源字典添加到Application.Resources.MergedDictionaries集合的服务。

// Service interface (defined in the 'infrastructure' project)
public interface IResourceAggregator
{
    void AddResource(Uri resourceUri);
}

// Service implementation (implemented at the application/shell level)
class ResourceAggregator : IResourceAggregator
{
    public void AddResource(Uri resourceUri)
    {
        var resourceDictionary = new ResourceDictionary() { Source = resourceUri };
        var app = Application.Current;
        app.Resources.MergedDictionaries.Add(resourceDictionary);
    }
}

我希望您在模块加载期间“解析”此服务并使用它来“注册”模块本地资源字典。

答案 1 :(得分:0)

模块启动时需要合并资源。您可以在此处详细了解:http://blogs.southworks.net/jdominguez/2008/09/presentation-model-with-datatemplates-in-compositewpf-prism-sample/

当然,您可以将此功能进一步抽象为可重用的服务。