我想使用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 ”。我不知道它在抱怨什么。
这是我的ThemeProperties:
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>
答案 0 :(得分:1)
我无法重现您的确切问题(我没有看到您提到的错误),但我可以看到几个问题:
DataGrid
列不属于可视树或逻辑树,因此它们不会继承DataContext
。因此,SignValue
属性的绑定无需绑定。DataContext
,它仍然不起作用,因为该列对DataGrid
是“全局”的,所以它会得到DataGrid
的{ {1}},而不是特定行的DataContext
。DataContext
样式设置绑定时,它相对于当前单元格的ColoredCell
,它是一个数据项,并且没有设置DataContext
属性。您需要相对于单元格本身进行绑定(SignValue
)。但是由于上面的其他问题,它也不起作用...... 不幸的是我不认为我的“参数化样式”技巧在这种情况下有一个简单的方法,因为需要在样式中改变的东西是绑定路径,并且没有办法“绑定路径约束“。所以我认为你应该坚持你的初始解决方案(这不是那么糟糕的IMO)。