Dot-Net

WPF 數據網格文本列中的綁定

  • February 2, 2009

我正在嘗試建構一個數據網格,其中一列是以該字型顯示的字型名稱。以前,我正在使用一個列錶框,我在其中定義了以下模板:

<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 嗎?

Jared 的回答是正確的,但我找到了解決我問題的具體解決方案。

<http://blogs.msdn.com/vinsibal/archive/2008/12/17/wpf-datagrid-dynamically-updating-datagridcomboboxcolumn.aspx>

按照此範例,我將 DataGridTextColumn 定義更改為:

&lt;dg:DataGridTextColumn Binding="{Binding Font.Name}" IsReadOnly="True" Header="Font"&gt;
   &lt;dg:DataGridTextColumn.ElementStyle&gt;
       &lt;Style TargetType="TextBlock"&gt;
           &lt;Setter Property="FontFamily" Value="{Binding Font.Name}" /&gt;
       &lt;/Style&gt;
   &lt;/dg:DataGridTextColumn.ElementStyle&gt;
&lt;/dg:DataGridTextColumn&gt;

而且我不需要擔心繼承DataContext的列。這給了我想要的結果。

引用自:https://stackoverflow.com/questions/502389