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