【问题标题】:How to use DataTemplates in Prism如何在 Prism 中使用数据模板
【发布时间】:2010-02-11 13:45:57
【问题描述】:

我使用 Prism 已经有一段时间了,我很享受解耦我的模块是多么容易。

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

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

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

我的问题是,如果不引用包含程序集,我就无法引用这些数据模板,所以在我的 xaml 文件中我写了如下内容:

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

当然,这并不是真正的解耦,尽管我尝试确保在我的代码中的其他任何地方都没有引用程序集。

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

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

【问题讨论】:

    标签: wpf dependency-injection prism datatemplate


    【解决方案1】:

    我建议创建一个服务,将资源字典添加到 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);
        }
    }
    

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

    【讨论】:

    • 这应该可以,唯一的缺点是,如果我没有明确地将数据模板导入其中,我在我的 xaml 文件中没有任何帮助。例如。 Resharper 警告“找不到资源”,我失去了反馈,让我知道我是否拼写正确等等。如果我只能将数据模板当作接口来引用的话......
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2012-06-10
      相关资源
      最近更新 更多