【问题标题】:C# WPF Datagrid coloring a cell with code behindC# WPF Datagrid 为带有代码的单元格着色
【发布时间】:2017-04-22 04:15:28
【问题描述】:

我的项目中有一个 DataGrid,其中一些列填充有 PropertyDataBinding。

<DataGrid x:Name="dataOutOfDb" Grid.Row="1" MaxHeight="500" AutoGenerateColumns="False" ItemsSource="{Binding Source=ZeichnungCollection}" Margin="47,10,1299,0" SelectionChanged="dataOutOfDb_SelectionChanged" CanUserAddRows="False" Grid.ColumnSpan="2" MouseDoubleClick="dataOutOfDb_MouseDoubleClick" >
    <DataGrid.Columns>
        <DataGridTextColumn Header="Zeichnungsnummer" Binding="{Binding AddColumnZeichnungsnummer, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
        <DataGridTextColumn Header="Index" Binding="{Binding AddColumnIndex, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
        <DataGridTextColumn Header="V-ID" Binding="{Binding AddColumnVolanteIndex, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
        <DataGridTextColumn Header="Änderung Intern" Binding="{Binding AddColumnAenderungIntern, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
        <DataGridTextColumn Header="Änderung Extern" Binding="{Binding AddColumnAenderungExtern, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
        <DataGridTextColumn Header="Dateiendung" Binding="{Binding AddColumnExtension, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
        <DataGridTextColumn Header="Status" Binding="{Binding AddColumnStatus, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True"/>
    </DataGrid.Columns>
</DataGrid>

现在我希望最后一列“状态”具有取决于状态本身的颜色。像这样,只有 Row 中的单元格是绿色或红色的。

Properties 的类是 ISerializable,Properties 是这样填充的:

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    this.GetObjectData(info, context);
    info.AddValue("AddColumnZeichnungsnummer", Zeichnungsnummer, typeof(string));
    info.AddValue("AddColumnIndex", Index, typeof(string));
    info.AddValue("AddColumnVolanteIndex", Volante_Index, typeof(int));
    info.AddValue("AddColumnAenderungIntern", Aenderung_Int, typeof(string));
    info.AddValue("AddColumnAenderungExtern", Aenderung_Ext, typeof(string));
    info.AddValue("AddColumnExtension", Extension, typeof(string));
    info.AddValue("AddColumnStatus", Status, typeof(string));
}

有人知道如何使用颜色设置状态单元格吗?

【问题讨论】:

    标签: c# wpf colors datagrid


    【解决方案1】:

    这个问题在 wpf Datagrid 世界中很常见,我建议您参考这个主题Change DataGrid cell colour based on values,其中@H.B.给出了如何以正确的方式做到这一点的中肯答案。

    【讨论】:

    • 感谢您提供的非常好的链接。我试过了,直接背景绑定;它不会导致任何错误,但单元格不会改变颜色。
    • "您必须在颜色所依赖的属性的设置器中触发属性更改通知。"你注意到这部分了吗?您必须添加 OnPropertyChanged("NameBrush");在您的状态设置器中
    • 是的,我在尝试添加 OnPropertyChanged(...) 时读到,但我无法在我的 Setter 中调用此方法。你知道我做错了什么吗?
    【解决方案2】:

    我试过了,直接背景绑定出来了;它不会导致任何错误,但单元格不会改变颜色

    使用背景设置器定义 CellStyle 将改变单元格的背景:

    <DataGridTextColumn Header="Status" Binding="{Binding AddColumnStatus, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True">
        <DataGridTextColumn.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="Background" Value="Yellow" />
            </Style>
        </DataGridTextColumn.CellStyle>
    </DataGridTextColumn>
    

    如果要根据 AddColumnStatus 属性的值设置单元格的 Background 属性,则需要为该属性可能具有的每个可能值指定一个 DataTrigger。以下示例标记将在 AddColumnStatus 属性返回“YourStatusA”时将 Background 属性设置为 Green,并在返回“YourStatusB”时将其设置为 Red:

    <DataGridTextColumn Header="Status" Binding="{Binding AddColumnStatus, UpdateSourceTrigger=LostFocus}" Width="Auto" IsReadOnly="True">
        <DataGridTextColumn.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="Background" Value="Yellow" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding AddColumnStatus}" Value="YourStatusA">
                        <Setter Property="Background" Value="Green" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding AddColumnStatus}" Value="YourStatusB">
                        <Setter Property="Background" Value="Red" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGridTextColumn.CellStyle>
    </DataGridTextColumn>
    

    另外请注意,如果您打算在运行时动态更改 AddColumnStatus 属性的值并希望更新单元格中的颜色,则定义 AddColumnStatus 属性的类应实现 INotifyPropertyChanged 接口并引发更改通知:@ 987654321@

    【讨论】:

    • 感谢您的回答,我不知道这是否是最好的方法,但它似乎是最简单的方法。我只需要在编辑状态时记下更正 xaml 代码即可。
    • 使用 CellStyle 无疑是改变 DataGrid 中单元格颜色的最佳方式和推荐方式。
    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2011-07-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多