2009-02-02 51 views
26

我想构建一个数据网格,其中一列是以该字体显示的字体名称。以前,我正在使用一个列表框,我已经定义了以下模板:绑定在一个WPF数据网格文本列

<TextBlock Text="{Binding Path=Name}" FontFamily="{Binding Path=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') 

一些谷歌搜索结果处理自定义控件建议更改自DependencyObject的财产,以FrameworkElement的,但我要继承DataGridTextColumn和定义自己的属性,这样做 - 必须有一个更好的办法。

我已经尝试了几种不同的绑定方法,包括尝试更改我的数据类中不同属性的字体大小(即FontSize="{Binding FontSize}")。他们都导致了与上述相同的错误。

任何人都知道我在这里做错了吗?

编辑:

感谢Jared的答复,我发现:

http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

的方法看起来声音,但我需要做一个绑定引用在正确的元素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?

+1

看看以下博客文章。它详细介绍了您所看到的问题。 [http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx](http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx)本质上问题在于DataGridTextColumn没有继承Binding的父项,因为它不是逻辑或可视化树的一部分。您必须设置一个继承上下文才能访问绑定信息。我引用的博客详细介绍了如何做到这一点。 – JaredPar 2009-02-02 07:05:19

回答

21

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。这给了我想要的结果。

1

尝试

TextBlock.FontFamily="{Binding Font.Name}" 

有时绑定系统有问题,找到其中一个属性声明,所以你需要给它一些帮助。

+0

在这种特殊情况下,FontFamily不是从Control继承的;它是DataGridTextColumn中的一个属性。 – 2009-02-02 15:18:34