WPF Prism - Как быть в состоянии загрузить правильный вид в неизвестную модель вида из внешней сборки? - PullRequest
1 голос
/ 29 июня 2011

В основном, вот ситуация:

У меня есть следующий макет:

  • FooAssembly.dll: FooUserControl и FooViewModel : NotificationObject
  • BarAssembly.dll: BarUserControl и BarViewModel : NotificationObject

Оба импортируются с использованием Unity или MEF.Я создаю экземпляр FooViewModel и BarViewModel и добавляю их в ObservableCollection<NotificationObject>, который связан с TabControl в моем основном приложении.

Теперь я получаю их полностью квалифицированные имена вместо соответствующих представлений.Решение ... использовать DataTemplate правильно?Проблема в том, что я заранее не знаю, ожидают ли в моем приложении FooUserControl / FooViewModel, и даже если я это сделал, их типы неизвестны, что означает, что я не могу скомпилировать это приложение.Итак, как вы вводите правильное представление, когда представления / модели представления импортируются с использованием Unity или MEF?

1 Ответ

0 голосов
/ 29 июня 2011

Я создал интерфейсный вызов IAppResources с помощью метода AddResourceDictionary(ResourceDictionary rd). Этот интерфейс использовался в модулях для загрузки ResourceDictionaries, и был реализован в приложении для получения словарей ресурсов и добавления их в MergedDictionaries приложения

Там может быть лучший выход, но у меня это сработало:)

Общий интерфейс

public interface IAppResources
{
    void AddResourceDictionary(ResourceDictionary resourceDictionary);
}

Модуль использует интерфейс для загрузки ресурсов

[ImportingConstructor]
public MyModule(IAppResources appResources)
{
    appResources.AddResourceDictionary(new MyModuleResources());
}

Приложение реализует интерфейс для загрузки ресурсов

[Export(typeof(IAppResources ))]
public class AppResources: IAppResources 
{
    #region IAppResources Members

    void IAppResources.AddResourceDictionary(ResourceDictionary resource)
    {
        App.Current.MainWindow.Resources.MergedDictionaries.Add(resource);
    }

    #endregion
}
...