我想使用 Thomas Levesque 通过附加属性的技巧为 DataGridTextColumn 创建一个参数化样式。但是,我无法使其适用于我的情况。
基本上,我想转换这个
<DataGridTextColumn Header="Today Chg $" Binding="{Binding TodaysValueChange, StringFormat=N2}" IsReadOnly="True">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell" BasedOn="{StaticResource RightAlignedCellStyle}">
<Setter Property="Foreground" Value="{Binding Path=TodaysValueChange, Converter={StaticResource PriceChangeToColor}}"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
进入这个
<DataGridTextColumn Header="Today Chg $" Binding="{Binding TodaysValueChange, StringFormat=N2}" IsReadOnly="True" CellStyle="{StaticResource ColoredCell}" ul:ThemeProperties.SignValue="{Binding TodaysValueChange}" ElementStyle="{StaticResource CellRightAlign}"/>
但是,我收到此错误: "'绑定'不能在'DataGridTextColumn'集合中使用。绑定只能在 DependencyObject 的 DependencyProperty 上设置",用于将 TodaysValueChange 绑定到 ul:ThemeProperties.SignValue"。我不知道它在抱怨什么。
这是我的主题属性:
public static class ThemeProperties
{
public static double GetSignValue(DependencyObject obj)
{
return (double)obj.GetValue(SignValueProperty);
}
public static void SetSignValue(DependencyObject obj, double value)
{
obj.SetValue(SignValueProperty, value);
}
public static readonly DependencyProperty SignValueProperty = DependencyProperty.RegisterAttached("SignValue", typeof(double), typeof(ThemeProperties), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.Inherits));
}
这是我在 App.xaml 中的样式资源:
<Style x:Key="ColoredCell" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter Property="Foreground" Value="{Binding Path=ul:ThemeProperties.SignValue, Converter={StaticResource PriceChangeToColor}}"/>
</Style>
我无法重现您的确切问题(我没有看到您提到的错误(,但我可以看到几个问题:
-
DataGrid
列不是视觉或逻辑树的一部分,因此它们不会继承DataContext
。因此,SignValue
属性的绑定没有任何要绑定的内容。 - 即使该列继承了
DataContext
,它仍然不起作用,因为该列对DataGrid
来说是"全局的",所以它会得到DataGrid
的DataContext
,而不是特定行的DataContext
。 - 在
ColoredCell
样式中设置绑定时,它相对于当前单元格的DataContext
,这是一个数据项,未设置SignValue
属性。您需要相对于单元格本身进行绑定(RelativeSource=Self
(。但是由于上述其他问题,它也无法正常工作...
不幸的是,我认为在这种情况下,我的"参数化样式"技巧没有简单的方法,因为样式中需要更改的是绑定路径,并且没有办法"绑定绑定的路径"。所以我认为你应该坚持你最初的解决方案(这不是那么糟糕的IMO(。