【问题标题】:WPF won't let me put a binding on the path of a binding -- is there another way?WPF 不允许我在绑定路径上放置绑定——还有其他方法吗?
【发布时间】:2010-11-12 13:03:15
【问题描述】:

我有一个DataTemplate,我将其用作CellTemplateGridViewColumn

我想为DataTemplate写这样的东西:

<DataTemplate
    x:Key="_myTemplate">
    <TextBlock
        Text="{Binding Path={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}, Path=Header}}" />
</DataTemplate>

我的GridView 绑定到DataTable,我想绑定到DataTable 的列,其名称等于GridViewColumn 的标题,DataTemplate 附加到。 [我希望这是有道理的!]

很遗憾,这不起作用。我收到 XamlParseException:“无法在 'Binding' 类型的 'Path' 属性上设置 'Binding'。只能在 DependenceyObject 的 DependencyProperty 上设置'Binding'。”

我该如何设置?

编辑(提升 DanM 对问题的评论)

我基本上需要一个DataTemplate,其绑定由DataContext 以及DataTemplate 附加到哪个列确定。有其他选择吗?

【问题讨论】:

  • 不确定为什么您将其标记为 silverlight 不支持 Silverlight RelativeSource
  • 抱歉,安东尼。我不知道silverlight 不支持RelativeSource。不过,我不喜欢使用 RelativeSource,所以如果我的问题有一个 XAML 解决方案不使用它,我仍然有兴趣听到它。

标签: wpf xaml binding datatemplate


【解决方案1】:

您不能将绑定分配给任何属性。该属性必须是 Binding 类型或作为对象的依赖属性实现。

Binding 类的Path 属性属于PropertyPath 类型,并且Binding 没有将Path 属性实现为依赖属性。因此,您不能以您尝试的方式动态绑定路径。

编辑

您基本上希望将元数据嵌入到驱动 DataTemplate 配置的绑定数据中。这不能仅在 XAML 中完成。您至少需要代码的一些支持。

在我看来,最好的方法是使用 ViewModel。这使得 XAML 中的绑定变得直截了当,并将“绑定什么与什么”决策下推到 ViewModel 的代码中。

【讨论】:

  • 谢谢,但我的问题是是否有另一种方法可以使用 XAML 实现我的目标。我基本上需要一个 DataTemplate,其绑定由 DataContext DataTemplate 附加到哪个列确定。有其他选择吗?
  • @Anthony,谢谢您的编辑。我的问题实际上来自关于如何在 GridView 中显示数据透视数据的讨论,其中在运行时查询数据库之前不知道列数和关联的绑定路径。我正在使用 MVVM 并且确实有一个 ViewModel,但我最初的解决方案是使用 XamlReader.Load() 在代码隐藏中动态生成 DataTemplates。这被严厉批评为“不好”(请参阅​​stackoverflow.com/questions/1156336/…),因此我尝试使用更灵活的 DataTemplate。
  • @Anothony(续),所以我的 DataContext 设置为我的 ViewModel,我的 GridView 的 ItemsSource 设置为 ViewModel 的一个属性(一个 DataTable),但我想我不明白ViewModel 可以解决如何将每个 GridViewColumn 映射到正确的 DataTable 列的问题,而无需借助动态加载的 XAML。
【解决方案2】:

你不想要这个吗?

{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}}

【讨论】:

  • 我相信您在这里所拥有的内容会将列中每个单元格的文本框设置为与标题相同。我想要的是将 GridViewColumn 绑定到 DataTable 的相应 DataColumn,其中 DataTable 中的列名称与 GridViewColumns 的 Header 值匹配。因此,如果 GridViewColumn 的 Header 是“Column3”,则该列将绑定到 DataTable 中名为“Column3”的列。我希望这是有道理的:)
  • 我认为你会遇到问题,因为 GridViews 是基于行的,即单元格是子级或行,而不是列。尝试查看 WPF 博士的这一系列帖子,它可能有助于消除一些困惑:drwpf.com/blog/ItemsControlSeries/tabid/59/Default.aspx。 WPF 的基本经验法则是,如果您尝试以并非专为某些事物设计的方式使用某些东西,将会变得异常困难,但他们通常有一种简单的方法可以做到这一点。找到简单的方法是困难的部分......
猜你喜欢
  • 2013-05-09
  • 2015-12-12
  • 1970-01-01
  • 2020-10-26
  • 2014-03-04
  • 1970-01-01
  • 2015-10-26
  • 2014-10-15
  • 2015-06-21
相关资源
最近更新 更多