代码之家  ›  专栏  ›  技术社区  ›  Thorsten Lorenz

如何在Prism中使用数据模板

  •  5
  • Thorsten Lorenz  · 技术社区  · 16 年前

    我已经使用Prism一段时间了,并且很享受分离模块的过程是多么的简单。

    这对于视图和视图模型尤其有效,因为您可以通过界面注入视图模型,并通过区域管理器注入视图。

    不幸的是,只有当我的视图是全面的用户控件时,这才有效,除非我在这里遗漏了一些东西(我真诚地希望我是这样)。

    但很多时候,我会创建一个视图模型和一个匹配的数据模板。然后其他程序集可以使用这些组件来组成视图。

    我的问题是,如果不引用包含程序集,我看不到引用这些数据模板的方法,因此在我的XAML文件中,我编写了如下内容:

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

    当然,这并不是真正的分离,尽管我试图确保,我在代码中的任何地方都不引用程序集。

    我想到的另一个解决方案是将数据模板放到基础设施项目中,但我也不太喜欢这样,因为我希望属于模块的所有内容都包含在其中(当然除了接口)。

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

    2 回复  |  直到 16 年前
        1
  •  4
  •   Daniel Pratt    16 年前

    我建议创建一个封装了向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);
        }
    }
    

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

        2
  •  0
  •   Julian Dominguez    16 年前

    当模块启动时,您需要合并资源。您可以在此处阅读更多信息: http://blogs.southworks.net/jdominguez/2008/09/presentation-model-with-datatemplates-in-compositewpf-prism-sample/

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