【问题标题】:Is it Possible to apply a DataTemplate to a Page?是否可以将 DataTemplate 应用于页面?
【发布时间】:2010-02-22 10:21:55
【问题描述】:

我正在尝试遵循此处列出的 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>

mainWindow.xaml 文件包含左侧的菜单和右侧的页面支架。我可以将 dataTemplate 应用于&lt;Page&gt; 吗?还是必须是&lt;UserControl&gt;?就目前而言,没有任何数据绑定,这是我想要应用视图模型的页面上的内容:

<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>

【问题讨论】:

  • @Mike,您必须将标记的元素标记为代码,否则它们不会呈现并且人们不会理解您的问题 - 这次我已经为您完成了(-:

标签: wpf mvvm datatemplate viewmodel


【解决方案1】:

DataTemplates 应用于内容,在大多数情况下,内容要么是 ContentControl 的 Content 属性,要么是 ItemsControl 的 Items/ItemsSource 属性。页面不是从 ContentControl(UserControl 是)派生的,因此不能将 DataTemplate 应用于其内容。

从您在这里所做的事情来看,这听起来不像您正在尝试做的事情。看起来您正在尝试在 DataTemplate 中使用页面,这就是错误告诉您的内容。页面被视为窗口,因为它是一个根容器,旨在将可视内容定义在 xaml 文件中。 UserControl 具有类似的目的,但可以插入到布局的任何位置。如果您将 vw:Vendors 更改为应该摆脱此特定错误的 UserControl,但您还应该考虑是否从拥有 UserControl 而不是直接将其内容放入 DataTemplate 中获得任何东西 - 这可以帮助阻止代码 -并强制你正确使用你的 ViewModel。

【讨论】:

  • 我最初的目标是使用基于导航的 WPF 应用程序,并使用不同的页面进行导航。如果我要使用 UserControls,我将如何完成相同类型的事情?我单击菜单中的一个项目,并显示该 UserControl。我会创建一个布局项(例如 Grid),然后将用户控件添加到 Grid 或从 Grid 中添加用户控件吗?
  • 您似乎在这里混淆了一些概念。您使用 Pages 的目标似乎是正确的——它们是专门为支持基于 URI 的导航而设计的。我认为您在尝试使用 DataTemplate 时,实际上希望将 Page 的 DataContext 设置为您的 VendorsViewModel 类的实例。这就是允许您从页面的 XAML 绑定到 VM 的属性的原因,就像您在上一个代码 sn-p 中所做的那样。您可以通过 XAML 或代码(如外部工厂或演示者)在页面上设置 DataContext。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多