能否将DataTemplate应用于页面?

4

我正在尝试遵循这里介绍的MVVM模式:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090097 我在我的MainWindowResources.xaml文件中有以下内容:

<DataTemplate DataType="{x:Type vm:VendorsViewModel}">
        <vw:Vendors/>  <--- I get a "Can't put a page in a style" error in blend with this
</DataTemplate>

我在MainWindow.xaml文件中有这个

<Window.Resources>
     <ResourceDictionary Source="MainWindowResources.xaml"/>
</Window.Resources>
文件在左侧包含一个菜单和右侧的页面容器。我能否将<Page>应用于dataTemplate?还是必须使用<UserControl>?目前,没有数据绑定,以下是我想要应用视图模型的页面上的内容:
<Custom:DataGrid Margin="0,30,0,0" d:LayoutOverrides="Width" ItemsSource="{Binding Path=AllVendors, Mode=Default}" >
     <Custom:DataGrid.Columns>
    <Custom:DataGridTextColumn Header="Company Name" Binding="{Binding Path=Name}" />
    </Custom:DataGrid.Columns>
</Custom:DataGrid>

1
@Mike,你必须将标记的元素标记为代码,否则它们不会呈现出来,人们也无法理解你的问题 - 这次我已经为你做了这个(-: - Murph
1个回答

3

DataTemplates被应用于Content,大多数情况下是ContentControl的Content属性或ItemsControl的Items / ItemsSource属性。Page不是从ContentControl派生的(UserControl是),因此无法将DataTemplate应用于其Content。

从你在这里做的事情来看,似乎你正在尝试在DataTemplate中使用Page,这就是错误提示的内容。Page像Window一样被视为根容器,旨在在xaml文件中定义可视化Content。UserControl具有类似的目的,但可以插入到布局中的任何位置。如果将vw:Vendors更改为UserControl,则可以消除此特定错误,但您还应考虑是否从拥有UserControl而不仅仅将其内容直接放入DataTemplate中获得任何好处-这可以帮助防止代码后台,并强制您正确使用ViewModel。


我的最初目标是使用基于导航的WPF应用程序,使用不同的页面进行导航。如果我要使用UserControl,我该如何完成相同类型的操作?当我在菜单中点击一个项目时,如何显示该UserControl?我是否需要创建一个布局项,例如Grid,然后向其中添加和移除UserControl? - Mike
1
看起来你可能对一些概念有些混淆。你使用 Pages 的目标似乎是正确的 - 它们专门设计用于支持基于 URI 的导航。我认为当你尝试使用 DataTemplate 时,你实际上想要将你的 Page 的 DataContext 设置为你的 VendorsViewModel 类的一个实例。这就允许你从页面的 XAML 绑定到你的 VM 的属性,就像你在最后的代码片段中所做的那样。你可以从 XAML 或代码(如外部工厂或 Presenter)设置 Page 上的 DataContext。 - John Bowen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接