Как использовать DataTemplates в Prism - PullRequest
5 голосов
/ 11 февраля 2010

Я уже некоторое время пользуюсь Prism и наслаждаюсь тем, насколько проще отсоединить мои модули.

Это особенно хорошо работает для представлений и моделей представлений, поскольку вы можете внедрять модели представлений через интерфейсы, а представления - через менеджера регионов.

К сожалению, это работает только тогда, когда мои взгляды являются полноценными пользовательскими элементами управления, если я не пропустил что-то здесь (и я искренне надеюсь, что это так).

Много раз я создаю ViewModel и соответствующий DataTemplate. Затем они могут использоваться другими сборками для составления представления.

Моя проблема в том, что я не вижу способа ссылаться на эти шаблоны данных без ссылки на содержащую сборку, поэтому в моем файле xaml я пишу что-то вроде:

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

Конечно, это на самом деле не отделено, хотя я стараюсь убедиться, что я не обращаюсь к сборке где-либо еще в моем коде.

Еще одним решением, о котором я подумал, было поместить шаблоны данных в проект инфраструктуры, но мне это тоже не очень нравится, так как я хочу, чтобы в нем содержалось все, что принадлежит модулю (за исключением интерфейсов, конечно, ).

Итак, у кого-нибудь есть хороший обходной путь, или я пропустил какую-то функцию Prism?

Ответы [ 2 ]

4 голосов
/ 11 февраля 2010

Я бы предложил создать службу, которая инкапсулирует добавление словарей ресурсов в коллекцию 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);
    }
}

Я ожидаю, что вы "разрешите" эту службу во время загрузки модуля и используйте ее для "зарегистрировать модуль-словарь локальных ресурсов.

0 голосов
/ 19 февраля 2010

Вам нужно будет объединить ресурсы при запуске модуля. Вы можете прочитать больше об этом здесь: http://blogs.southworks.net/jdominguez/2008/09/presentation-model-with-datatemplates-in-compositewpf-prism-sample/

Конечно, вы можете дополнительно абстрагировать эту функцию в службу многократного использования.

...