WPF 數據網格文本列中的綁定
我正在嘗試建構一個數據網格,其中一列是以該字型顯示的字型名稱。以前,我正在使用一個列錶框,我在其中定義了以下模板:
<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 定義更改為:
<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的列。這給了我想要的結果。