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

问题描述:

我试图找出在MVVM中耦合我的视图和ViewModels的最佳方法,并且我已经使用键入了ViewModel优先方法,输入 DataTemplates,如this articlethis answer中所述。我使用Prism,并有多个模块,它们有自己的项目/类库。我应该在哪里定义我的数据模板?

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

  1. 我应该把在资源字典,其生活在具有类型/的ViewModels它呈现在同一个项目中的DataTemplates?
  2. 我应该把DataTemplates放在一个资源字典中,该字典位于具有应用程序的MainWindow(即Shell.xaml)的项目中?
  3. 是否应将这些资源字典添加到App.Current.MainWindow.Resources.MergedDictionaries

我希望这是足够的信息来描述我正在尝试做什么。

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

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

+0

嘿,谢谢你的建议。我前段时间阅读过这篇文章,并使用了Rachel在那里描述的方法。我有一个带有主题文件夹的基础结构项目,我在“资源字典”中存储了我的样式。问题是这个基础设施项目被我所有的其他项目/模块引用。为了使用类型化的'DataTemplates',我需要引用包含我的ViewModels的项目,这意味着创建一个循环依赖项。我应该创建一个单独的项目来保存'DataTemplates'吗? – 2012-03-04 08:30:52

+1

我想你可以在模块的程序集中创建文件夹主题。我在当前项目中这样做 - 我在单独的UI组件中共享模板,几乎每个模块的程序集都有它自己的Themes文件夹 – chopikadze 2012-03-04 09:15:05

+0

好的,这听起来像是要走的路!谢谢,我感谢你的建议。我会看看如果我能得到它的工作。 – 2012-03-04 09:26:16

更新说明更清楚。

我会说如果你的DataTemplate是通用的: 即你有一个UserControl绑定到一个ViewModel,并且该ViewModel具有BaseViewModel,它暴露某种属性。您的DataTemplate正在显示这些属性。所以你可以在实现BaseViewModel的每个ViewModel上使用这个DataTemplate。

最好是把它放在App.xaml中,这样你就可以用键把它拉出来并应用到你项目中的不同位置。

但是,如果你的DataTemplate是非常具体的,

即有,只有结合在该视图模型指定属性的用户控件,你知道没有其他控件将绑定到视图模型,你将要投入相同的Xaml文件的Resources或您定义UserControl的位置。

+0

据我所知,我可以使用'DataTemplates'来定制数据的显示,比如'ListBox',我可以重复使用这个'DataTemplate',并通过引用它的'x: Key'。但根据Josh Smith的文章(见上文),我相信我也可以使用**键入**'DataTemplates'来将View/UserControl耦合到'ViewModel'。即如果我将ViewModel对象添加到“ListBox”中,WPF将使用DataTemplate中指定的UserControl来呈现ViewModel(而不是使用ToString())。我在这里? – 2012-03-04 04:48:08

+0

@Angavar是的,你也可以使用输入的DataTemplate来应用它。我只是给你一个例子,如何使用他们的X:钥匙拉出模板,样式等。 – 2012-03-04 18:18:59

根据Microsofts App Studio的说法,DataTemplates应该位于Views目录下的DataTemplates子目录中。通用应用程序具有Windows用户界面和Windows Phone UI的此目录,因此它不在共享项目中,因为它们不是相同的。不要使用Converge PRISM体系结构。它完全错误的设计!这不是在Windows和Windows Phone架构下编写的,而是像他们称之为融合。它应该已经完全重新设计,就像它在微软AppStudio中的工作一样。不要寻找它不在其中,也不需要的依赖注入。大多数使用依存注入存根或假接口。用于设计数据的DataContext现在对json数据的作用如此之好以至于依赖注入组件将会过度杀伤。