Mat*_*las 26 .net data-binding wpf xaml datagrid
我正在尝试构建一个数据网格,其中一列是以该字体显示的字体名称.以前,我正在使用列表框,我在其中定义了以下模板:
<TextBlock Text="{Binding Path=Name}" FontFamily="{Binding Path=Name}"/>
Run Code Online (Sandbox Code Playgroud)
这很好用.所以,我调整了数据结构(Name变为Font.Name)并移动到数据网格上试试这个:
<dg:DataGridTextColumn Binding="{Binding Font.Name}"
FontFamily="{Binding Font.Name}" IsReadOnly="True" Header="Font"/>
Run Code Online (Sandbox Code Playgroud)
现在字体名称都以默认字体显示,我收到此错误:
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')
Run Code Online (Sandbox Code Playgroud)
处理自定义控件的一些Google结果建议将属性从DependencyObject更改为FrameworkElement,但是我必须继承DataGridTextColumn并定义我自己的属性才能这样做 - 必须有更好的方法.
我尝试了几种不同的绑定方法,包括尝试在我的数据类中使用distinct属性更改字体大小(即FontSize="{Binding FontSize}"
).它们都导致了与上面相同的错误.
谁知道我在做错了什么?
编辑:
感谢Jared的回复,我发现了以下内容:
该方法看起来很合理,但我需要创建一个绑定,引用每行的DataContext中的正确元素,而不是为整个列共享单个值.
代码背后:
fontDataGrid.DataContext = from font
in new InstalledFontCollection().Families;
Run Code Online (Sandbox Code Playgroud)
XAML:
Binding="{Binding Font.Name}"
FontFamily="{Binding (FrameworkElement.DataContext).Font.Name,
RelativeSource={x:Static RelativeSource.Self}}"
Run Code Online (Sandbox Code Playgroud)
使用上面的XAML显然不正确,因为DataContext是整个字体集合.但我不能索引集合,因为我不知道行号是什么(或者我?).我可以用一些方法来实现这个目标吗?
第二个问题 - 为什么即使没有DataContext,Binding属性似乎也能正常工作?它是在寻找ItemsSource吗?
Mat*_*las 22
Jared的回答是正确的,但我找到了一个解决我问题的具体解决方案.
在这个例子之后,我将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>
Run Code Online (Sandbox Code Playgroud)
我不需要担心继承DataContext的列.这给了我想要的结果.