Где я должен определять свои данные?

Я пытаюсь разработать лучший способ связать свои представления и представления в MVVM, и я решил использовать первый подход ViewModel, используя типизированные DataTemplates, как описано в эта статья и этот ответ. Я использую Prism и имею несколько модулей, которые имеют свои собственные проекты/библиотеки классов.

Мой вопрос: Где мои данные DataTemplates будут жить в моем решении?

  • Должен ли я помещать DataTemplates в словарь ресурсов, который живет в том же проекте, который имеет типы /ViewModels, которые он отображает?
  • Должен ли я помещать DataTemplates в словарь ресурсов, который живет в проекте с приложением MainWindow (т.е. Shell.xaml)?
  • Должны ли эти словари ресурсов быть добавлены к App.Current.MainWindow.Resources.MergedDictionaries?

Надеюсь, этого достаточно для описания того, что я пытаюсь сделать.

Обновление: см. комментарии выбранного ответа.

Ответ 1

Я уверен, что лучший способ здесь - использовать файл ресурсов Themes\Generic.xaml. Это файл (он должен быть точно в папке "Темы" и имеет имя точно Generic.xaml), используемое движком тем WPF/Silverlight, и содержит ресурсы, разделяемые всем приложением. Вы также можете создать отдельный файл в папке "Темы" с именем "Generic.DataTemplates.xaml" и добавить к нему ссылку из Generic.xaml. Google многое знает о generic.xaml или вы можете увидеть более подробную информацию в моем ответе здесь: WPF Prism - Где разместить ресурсы?

Ответ 2

Обновлено, чтобы объяснить более понятное.

Я скажу, если ваш DataTemplate является общим: i.e У вас есть UserControl, который привязывается к ViewModel, и что ViewModel имеет BaseViewModel, который предоставляет какие-то свойства. Данные DataTemplate отображают эти свойства. Таким образом, вы можете использовать этот DataTemplate для каждого ViewModel, который реализует BaseViewModel.

Лучше поместить его в App.xaml, чтобы вы могли вытащить его с помощью ключа и применить его в другом месте вашего проекта.

Но если ваш DataTemplate очень специфичен,

т.е. существует UserControl, который связывается только с указанным свойством в этом ViewModel, и вы не знаете, что никакой другой элемент управления не будет привязан к этой ViewModel, вам нужно будет поместить в тот же файл Xaml Resources или где вы определяете свой UserControl.

Ответ 3

Согласно Microsoft App Studio, DataTemplates должен жить в подкаталоге DataTemplates в каталоге представлений. Универсальное приложение имеет этот каталог как для пользовательского интерфейса Windows, так и для интерфейса Windows Phone, поэтому его нет в проекте Shared, потому что они не совпадают. Не используйте архитектуру Converge PRISM. Это совершенно неправильно! Это не было написано с учетом архитектуры Windows и Windows Phone, но они называются Converged. Он должен был быть полностью переработан, как и в Microsoft App Studio. Не ищите зависимую инъекцию, а не в ней и не нужны. Большинство используют Injection Dependency для заглушек или поддельных интерфейсов. DataContext для данных проекта теперь настолько хорош с данными json, что компонент Injection Dependency будет излишним.