WPF 数据网格文本列中的绑定
Posted
技术标签:
【中文标题】WPF 数据网格文本列中的绑定【英文标题】:Binding in a WPF data grid text column 【发布时间】:2010-10-04 21:09:52 【问题描述】:我正在尝试构建一个数据网格,其中一列是以该字体显示的字体名称。以前,我使用的是一个列表框,我在其中定义了以下模板:
<TextBlock Text="Binding Path=Name" FontFamily="Binding Path=Name"/>
这工作得很好。所以,我调整了数据结构(Name 变成了 Font.Name)并移动到数据网格上来试试这个:
<dg:DataGridTextColumn Binding="Binding Font.Name"
FontFamily="Binding Font.Name" IsReadOnly="True" Header="Font"/>
现在字体名称都以默认字体显示,我得到这个错误:
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or
FrameworkContentElement for target element.
BindingExpression:Path=Font.Name; DataItem=null; target element is
'DataGridTextColumn' (HashCode=56915998); target property is 'FontFamily'
(type 'FontFamily')
一些处理自定义控件的 Google 结果建议将属性从 DependencyObject 更改为 FrameworkElement,但我必须继承 DataGridTextColumn 并定义我自己的属性才能这样做 - 必须有更好的方法。
我尝试了几种不同的绑定方法,包括尝试使用我的数据类中的不同属性(即FontSize="Binding FontSize"
)仅更改字体大小。它们都导致了与上述相同的错误。
有人知道我在这里做错了什么吗?
编辑:
感谢Jared的回复,我发现了以下内容:
https://docs.microsoft.com/en-us/archive/blogs/jaimer/forwarding-the-datagrids-datacontext-to-its-columns
该方法看起来不错,但我需要为每一行创建一个引用 DataContext 中正确元素的绑定,而不是为整个列共享一个值。
后面的代码:
fontDataGrid.DataContext = from font
in new InstalledFontCollection().Families;
XAML:
Binding="Binding Font.Name"
FontFamily="Binding (FrameworkElement.DataContext).Font.Name,
RelativeSource=x:Static RelativeSource.Self"
使用上面的 XAML 显然是不正确的,因为 DataContext 是整个字体集合。但我无法索引集合,因为我不知道行号是什么(或者我知道吗?)。有什么方法可以实现吗?
还有一个次要问题 - 为什么 Binding 属性似乎工作得很好,即使没有 DataContext?它是在查看 ItemsSource 吗?
【问题讨论】:
看看下面的博文。它详细介绍了您所看到的问题。 http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx 本质上,问题在于 DataGridTextColumn 没有可以从中继承 Binding 的父级,因为它不是逻辑树或可视树的一部分。您必须设置继承上下文才能访问绑定信息。我引用的博客详细介绍了如何执行此操作。 【参考方案1】:Jared 的回答是正确的,但我找到了解决我问题的具体解决方案。
http://blogs.msdn.com/vinsibal/archive/2008/12/17/wpf-datagrid-dynamically-updating-datagridcomboboxcolumn.aspx
按照这个示例,我将 DataGridTextColumn 定义更改为:
<dg:DataGridTextColumn Binding="Binding Font.Name" IsReadOnly="True" Header="Font">
<dg:DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="FontFamily" Value="Binding Font.Name" />
</Style>
</dg:DataGridTextColumn.ElementStyle>
</dg:DataGridTextColumn>
而且我不需要担心继承 DataContext 的列。这给了我想要的结果。
【讨论】:
【参考方案2】:试试
TextBlock.FontFamily="Binding Font.Name"
有时绑定系统在查找属性声明的位置时遇到问题,因此您需要提供一些帮助。
【讨论】:
在这种特殊情况下,FontFamily 不是从 Control 继承的;它是 DataGridTextColumn 中的一个属性。 我的错,我会将它更新为 TextBlock,因为它应该会使用它。 仍然不行,同样的原始错误。我认为 Jared 有正确的理由。以上是关于WPF 数据网格文本列中的绑定的主要内容,如果未能解决你的问题,请参考以下文章