WPF:这个DataGridTextColumn样式有什么问题?

时间:2013-12-12 19:49:56

标签: wpf binding datagrid styles

我想使用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>

1 个答案:

答案 0 :(得分:1)

我无法重现您的确切问题(我没有看到您提到的错误),但我可以看到几个问题:

  • DataGrid列不属于可视树或逻辑树,因此它们不会继承DataContext。因此,SignValue属性的绑定无需绑定。
  • 即使该列继承了DataContext,它仍然不起作用,因为该列对DataGrid是“全局”的,所以它会得到DataGrid的{ {1}},而不是特定行的DataContext
  • 当您以DataContext样式设置绑定时,它相对于当前单元格的ColoredCell,它是一个数据项,并且没有设置DataContext属性。您需要相对于单元格本身进行绑定(SignValue)。但是由于上面的其他问题,它也不起作用......

不幸的是我不认为我的“参数化样式”技巧在这种情况下有一个简单的方法,因为需要在样式中改变的东西是绑定路径,并且没有办法“绑定路径约束“。所以我认为你应该坚持你的初始解决方案(这不是那么糟糕的IMO)。