2009-02-02 58 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