Я использовал Призму некоторое время теперь и наслаждаюсь, насколько легче она должна отделить мои модули.
Это особенно работает отлично для представлений и моделей представления, так как можно ввести модели представления через интерфейсы и представления через менеджера региона.
К сожалению, это только работает, когда мои представления являются полноценными пользовательскими элементами управления, если я не пропускаю что-то здесь (и я искренне надеюсь, что я).
Много времен, хотя, я создам ViewModel и соответствие DataTemplate. Они могут затем использоваться другими блоками для создания представления.
Моя проблема, который я не вижу способа отослать к этим datatemplates, не ссылаясь на содержание блока, таким образом, в моем xaml файле я пишу что-то как:
<ResourceDictionary Source="pack://application:,,/......>
Конечно, это действительно не отделяется, хотя я пытаюсь удостовериться, который я не отсылаю к блоку больше нигде в моем коде.
Другое решение, о котором я думал, должен был поместить datatemplates в Инфраструктурный проект, но мне не нравится так слишком много также, поскольку я хочу все, что принадлежит модулю, который будет содержаться в нем (кроме интерфейсов, конечно).
Так, у кого-либо есть хорошее обходное решение, или я пропускал некоторую функцию Prism?
Я бы предложил создать сервис, который инкапсулирует добавление словарей ресурсов в 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);
}
}
Я предполагаю, что вы будете "разрешать" этот сервис во время загрузки модуля и использовать его для "регистрации" локальных словарей ресурсов модуля.
Вам нужно будет объединить ресурсы при запуске модуля. Подробнее об этом можно прочитать здесь: http://blogs.southworks.net/jdominguez/2008/09/presentation-model-with-datatemplates-in-compositewpf-prism-sample/
Конечно, вы можете далее абстрагировать эту функциональность до многоразового сервиса.