Wpf 我应该在哪里定义我的数据模板?

Wpf 我应该在哪里定义我的数据模板?,wpf,mvvm,user-controls,datatemplate,Wpf,Mvvm,User Controls,Datatemplate,我正在努力找出在MVVM中耦合视图和视图模型的最佳方法,我已经确定了使用类型化数据模板的ViewModel优先方法,如和中所述。我使用的是Prism,有多个模块,它们有自己的项目/类库 我的问题是:我的数据模板应该放在我的解决方案中的哪里? 我是否应该将DataTemplates放在一个资源字典中,该字典位于具有其呈现的类型/视图模型的同一项目中 我是否应该将DataTemplates放在一个资源字典中,该字典位于具有应用程序主窗口(即Shell.xaml)的项目中 是否应将这些资源字典添加到A

我正在努力找出在MVVM中耦合视图和视图模型的最佳方法,我已经确定了使用类型化数据模板的ViewModel优先方法,如和中所述。我使用的是Prism,有多个模块,它们有自己的项目/类库

我的问题是:我的数据模板应该放在我的解决方案中的哪里?

  • 我是否应该将DataTemplates放在一个资源字典中,该字典位于具有其呈现的类型/视图模型的同一项目中
  • 我是否应该将DataTemplates放在一个资源字典中,该字典位于具有应用程序主窗口(即Shell.xaml)的项目中
  • 是否应将这些资源字典添加到
    App.Current.MainWindow.Resources.MergedDictionaries
  • 我希望这是足够的信息来描述我正在尝试做什么


    更新:查看所选答案的注释。

    更新以更清楚地解释

    我会说,如果您的数据模板是通用的: i、 e您有一个绑定到ViewModel的UserControl,该ViewModel有BaseViewModel,它公开了某种属性。您的DataTemplate正在显示这些属性。因此,您可以在实现BaseViewModel的每个ViewModel上使用此DataTemplate

    最好将它放在
    App.xaml
    中,这样您就可以用钥匙将其取出并应用到项目中的不同位置

    但如果您的数据模板非常具体


    i、 e有一个UserControl仅绑定该ViewModel中的指定属性,您知道没有其他控件会绑定到该ViewModel,您将希望放入同一Xaml文件的
    资源
    或定义
    用户控件的位置

    我确信这里最好的方法是使用Themes\Generic.Xaml资源文件。这是WPF/Silverlight主题引擎使用的文件(它应该正好位于文件夹主题中,并且名称正好是Generic.xaml),包含通过整个应用程序共享的资源。您还可以在文件夹主题中创建单独的文件,名称为Generic.DataTemplates.xaml,并从Generic.xaml添加指向该文件的链接。谷歌非常了解generic.xaml,或者你可以在我的回答中看到更多细节:

    根据微软App Studio,DataTemplates应该位于视图目录下的DataTemplates子目录中。通用应用程序的Windows UI和Windows Phone UI都有此目录,因此它不在共享项目中,因为它们不相同。不要使用Converge PRISM体系结构。这是完全错误的设计!这不是在考虑Windows和Windows Phone体系结构的情况下编写的,而是他们所说的融合。它应该完全重新设计,就像在微软的AppStudio中一样。不要寻找依赖注入,它不在其中,也不需要。大多数对存根或伪接口使用依赖注入。用于设计数据的DataContext现在可以很好地处理json数据,以至于依赖项注入组件可能会被过度使用

    我知道我可以使用
    DataTemplates
    来定制数据在
    ListBox
    中的显示,我可以重复使用此
    DataTemplate
    ,并通过引用其
    x:Key
    将其应用于多个
    ListBox
    。但根据Josh Smith的文章(见上文),我相信我也可以使用键入的
    数据模板
    将视图/用户控件与
    视图模型
    耦合。例如,如果我将ViewModel对象添加到
    列表框
    ,WPF将使用
    数据模板
    中指定的用户控件(而不是使用ToString())呈现ViewModel。我离这里很远吗?@Angavar是的,你也可以使用类型化数据模板来应用它。我只是举一个例子,比如如何使用他们的x:Key拉出模板、样式等。嘿,谢谢你的建议。我不久前读过这篇文章,我使用了瑞秋在那里描述的方法。我有一个带有主题文件夹的基础设施项目,我将我的样式存储在
    资源字典中。问题是我的所有其他项目/模块都引用了这个基础设施项目。为了使用类型化的
    DataTemplates
    ,我需要引用包含我的ViewModels的项目,这意味着创建一个循环依赖项。我是否应该创建一个单独的项目来只保存
    数据模板
    ?我认为您可以在模块的程序集中创建文件夹主题。我在当前项目中就是这样做的——我在单独的UI组件中共享了模板,几乎每个模块的组件都有自己的主题folderOk,这听起来像是一种方式!谢谢,谢谢你的建议。我看看能不能让它工作。太好了!我接受了你的建议,效果很好。我将模块程序集中的
    数据模板定义为资源字典,然后将该资源字典添加到
    App.Current.MainWindow.Resources.MergedDictionaries
    中的合并资源字典中。谢谢您的时间:)