如何将ViewModel应用于页面内的UserControl?

时间:2010-02-28 09:24:44

标签: wpf xaml mvvm viewmodel

做这样的事情:

<DataTemplate DataType="{x:Type vm:AllCustomersViewModel}">
<vw:AllCustomersView />
</DataTemplate>

当我想将ResourceDictionary应用于ViewModel作为root用户时,UserControl工作,但当我在UserControl内有Page?``\ Would I create a时我该怎么做for all my Pages then at the top of each ResourceDictionary <Page.Resources> <ResourceDictionary Source="../MainWindowResources.xaml"/> </Page.Resources> Page`的内容如下:

{{1}}

3 个答案:

答案 0 :(得分:0)

(对于没有对这个问题发表评论我很抱歉。我的评论太长了。)

你能解释一下这个问题吗?

你有一个UserControl在自己的资源中有提到的DataTemplate,对吗?

现在你想在页面中使用这个控件,对吗?

您的问题是:您是否需要在使用它的每个页面中声明UserControl的资源?

如果只有用户控件本身需要访问这些资源,则不需要在其他地方重新声明它们。如果您希望这些资源可用于托管页面(或层次结构中的某些元素),则应在此处声明资源。如果它们应该在应用程序的任何位置可用,建议在应用程序级别声明它们。

答案 1 :(得分:0)

更好的选择是在App.xaml中包含资源。这样,在应用程序中显示ViewModel的任何地方都将获得模板。

答案 2 :(得分:0)

我同意安倍。您所要做的就是将资源字典文件添加到项目中(例如Resources.xaml

<DataTemplate DataType="{x:Type vm:AllCustomersViewModel}">
<vw:AllCustomersView />
</DataTemplate>
在里面。然后在App.xaml中输入以下内容:

<Application.Resources>
    <ResourceDictionary Source="Resources.xaml"/>
</Application.Resources>

因此,每当WPF试图弄清楚如何呈现类(它当前不知道如何呈现)时,它会在控件资源中查找,如果没有模板,则检查控件容器资源。如果没有,它会继续上升,直到没有容器。然后转到Application.Resources。如果它找到它然后使用该模板呈现。如果没有,那么它只调用ToString()。把你所有的全局内容放在Application.Resources中,这样你就不会在你的应用程序中重复自己,保持干燥(不要重复自己)。

旁注。我发现this post是将大量ViewModel绑定到Views而不在资源字典中显式写入每个ViewModel的最简单的解决方案。它使用IValueConverter动态返回所需的视图。