WPF不允许在绑定路径上放置绑定,是否有其他方法?

5

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

我想为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'。'Binding'只能设置为DependenceyObject的DependencyProperty。”我该如何设置呢?
编辑(DanM对问题的评论):基本上,我需要一个DataTemplate,它的绑定是由DataContext和附加到哪一列的DataTemplate决定的。有没有替代方案?

不确定为什么你将这个标记为Silverlight,因为RelativeSource在Silverlight中不受支持。 - AnthonyWJones
抱歉,安东尼。我不知道Silverlight不支持RelativeSource。虽然我并不一定非要使用RelativeSource,但如果有一种XAML解决方案可以回答我的问题而不使用它,我仍然很感兴趣听听。 - devuxer
2个回答

0

你难道不想要这个吗?

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

我相信你这里的代码会将列中每个单元格的文本框设置为与标题相同。但是我想要的是将GridViewColumn绑定到DataTable的适当DataColumn,其中DataTable中的列名与GridViewColumns的Header值匹配。所以,如果GridViewColumn的Header是"Column3",那么这一列将绑定到DataTable中名为"Column3"的列。希望我表达清楚了 :) - devuxer
我认为你尝试的方式会有问题,因为GridView是基于行的,即单元格是行的子级或子元素,而不是列。尝试查看Dr. WPF的这个系列帖子,它可能有助于澄清一些困惑:http://drwpf.com/blog/ItemsControlSeries/tabid/59/Default.aspx。对于WPF的一个基本经验法则是,如果你试图以某种方式使用某个东西,而它并非为此设计,那么事情将变得非常困难,但通常已经有了一种简单的方法来完成它。找到简单的方法才是难点... - Bryan Anderson

0

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

Binding类的Path属性是PropertyPath类型,而Binding未将Path属性实现为依赖属性。因此,您无法以您尝试的方式动态绑定Path。

编辑

您基本上想要在绑定的数据中嵌入元数据,以驱动DataTemplate的配置。这无法仅通过XAML完成。您需要至少从代码中获得一些支持。

我认为最好的方法是使用ViewModel。这使得XAML中的绑定变得简单明了,并将“用什么绑定什么”决策推迟到ViewModel的代码中。


谢谢,但我的问题是是否有另一种使用XAML实现我的目标的方式。我基本上需要一个DataTemplate,它的绑定是由DataContext和DataTemplate所附加到的列决定的。是否有替代方法? - devuxer
@Anthony,感谢您的编辑。我的问题实际上是出自于如何在GridView中显示数据透视表的讨论,其中列数和相关绑定路径直到运行时从数据库查询才知道。我正在使用MVVM并且有一个ViewModel,但我的初始解决方案是在代码后台动态生成DataTemplates,使用XamlReader.Load()。这被广泛批评为“不好”(请参见http://stackoverflow.com/questions/1156336/is-it-possible-to-configure-a-gridview-to-show-pivoted-data-using-static-xaml-if),因此我尝试了更灵活的DataTemplate。 - devuxer
1
@Anothony(续),所以我的DataContext设置为我的ViewModel,我的GridView的ItemsSource设置为ViewModel的一个属性(DataTable),但我想我不明白ViewModel如何解决将每个GridViewColumn映射到正确的DataTable列的问题,而不必诉诸动态加载XAML。 - devuxer

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