我应该在哪里定义我的datatemplates?

时间:2012-03-04 00:12:06

标签: wpf mvvm user-controls datatemplate

我正在尝试找出在MVVM中耦合我的Views和ViewModel的最佳方法,我已经使用 typed DataTemplates确定了ViewModel优先方法,如{{3}中所述和this article。我正在使用Prism并拥有多个具有自己的项目/类库的模块。

我的问题是:我的DataTemplates在我的解决方案中应该在哪里?

  1. 我应该将DataTemplates放在资源字典中,该资源字典位于同一个项目中,该项目具有它呈现的类型/ ViewModel吗?
  2. 我应该将DataTemplates放在一个资源字典中,该资源字典位于具有应用程序MainWindow(即Shell.xaml)的项目中吗?
  3. 是否应将这些资源词典添加到App.Current.MainWindow.Resources.MergedDictionaries
  4. 我希望这足以描述我正在尝试做的事情。

    更新:查看所选答案的评论。

3 个答案:

答案 0 :(得分:2)

更新以解释更清楚。

我会说你的DataTemplate是通用的: 即你有一个绑定到ViewModel的UserControl,而ViewModel有BaseViewModel,它暴露了某种属性。您的DataTemplate正在显示这些属性。因此,您可以在实现BaseViewModel的每个ViewModel上使用此DataTemplate。

最好将其放在App.xaml中,这样您就可以使用密钥将其拉出来并应用于项目中的不同位置。

但如果您的DataTemplate非常具体,

即有一个UserControl仅绑定在该ViewModel中的指定属性上,并且您知道没有其他控件将绑定到该ViewModel,您将希望放入相同的Xaml文件的Resources或您定义的位置UserControl

答案 1 :(得分:2)

我确信这里最好的方法是使用Themes \ Generic.xaml资源文件。这是WPF / Silverlight主题引擎使用的文件(它应该完全位于文件夹主题中并且名称完全为Generic.xaml),并包含通过整个应用程序共享的资源。您还可以在名称为Generic.DataTemplates.xaml的文件夹主题中创建单独的文件,并从Generic.xaml添加指向它的链接。 Google对generic.xaml了解很多,或者您可以在我的答案中查看更多详细信息:WPF Prism - Where to put Resources?

答案 2 :(得分:0)

根据Microsofts App Studio,DataTemplates应该位于Views Directory下的DataTemplates子目录中。通用应用程序具有Windows UI和Windows Phone UI的此目录,因此它不在共享项目中,因为它们不是相同的。不要使用Converge PRISM架构。它设计完全错误!这不是用Windows和Windows Phone架构编写的,但他们称之为Converged。它本应完全重新设计,就像在微软App Studio中一样。不要寻找依赖注入它不在其中而不是需要它。大多数使用依赖注入来存根或伪接口。设计数据的DataContext现在可以很好地使用json数据,因此依赖注入组件会过度。