我想構建一個數據網格,其中一列是以該字體顯示的字體名稱。以前,我正在使用一個列表框,我已經定義了以下模板:綁定在一個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的答覆,我發現:
的方法看起來聲音,但我需要做一個綁定引用在正確的元素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](http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx)本質上問題在於DataGridTextColumn沒有繼承Binding的父項,因爲它不是邏輯或可視化樹的一部分。您必須設置一個繼承上下文才能訪問綁定信息。我引用的博客詳細介紹瞭如何做到這一點。 – JaredPar 2009-02-02 07:05:19