WPF - XAML - 数据触发器,不带绑定/值仅触发器

时间:2010-11-10 09:04:09

标签: wpf xaml datatrigger

我在DataGrid中有一个值网格。在每个单元格中,我有4个值中的一个,我希望每个值都有一个相关的颜色。

过去我的所有数据触发器都是格式化的;

<DataTrigger Binding="{Binding Status}" Value="R">
     <Setter Property="xcdg:DataRow.Background" Value="Pink" />
</DataTrigger>

但我需要一些格式;

<DataTrigger Binding="{Binding *}" Value="R">
     <Setter Property="xcdg:DataRow.Background" Value="Pink" />
</DataTrigger>

这样就可以检查任何单元格的值。我不能使用显式绑定的原因是列的数量及其名称是动态的,我使用扩展的CustomTypeDescriptor来公开列和行以进入网格。

提前致谢!

2 个答案:

答案 0 :(得分:0)

在绑定中使用ValueConverter是一种选择吗?这样你就可以检查转换器应该返回哪个值。

答案 1 :(得分:0)

<DataTrigger Binding="{Binding Path=Content, RelativeSource={x:Static RelativeSource.Self}}" Value="Failure">
    <Setter Property="xcdg:DataRow.Background" Value="Red" />
</DataTrigger>

我需要使用相对来源。

继续我最终使用的是;

        <xcdg:DataGridControl.Resources>
            <c:ColorConverter x:Key="colorConverter" />
            <Style TargetType="{x:Type xcdg:DataCell}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type xcdg:DataRow}}}" Value="False">
                        <Setter Property="xcdg:DataCell.Background" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource colorConverter}}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=IsDirty, RelativeSource={RelativeSource AncestorType={x:Type xcdg:DataRow}}}" Value="True">
                        <Setter Property="xcdg:DataCell.Background" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource colorConverter}}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </xcdg:DataGridControl.Resources>

我的Color转换器看起来有点像这样;

[ValueConversion(typeof(DataCell), typeof(Brush))]
public class ColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var cell = (DataCell)value;
        var content = (string)cell.Content;

        if (content == null || cell.ParentRow.IsSelected)
        {
            return DependencyProperty.UnsetValue;
        }

        if (content == "Unknown")
        {
            return new SolidColorBrush(Colors.LightYellow);
        }

        ...

        return DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        return null;
    }
}

我现在唯一的问题是当我滚动我的背景时,在重复使用DataRows时不会更新颜色。

当重新使用DataRow时,我无法找到要挂钩的事件...