C# WPF 根据数据更改 DataGrid 行(背景)颜色
C# WPF change DataGrid row (background) color based on the data
我有 Datagrid 视图,如下所示:
选择的是“状态”,它有 3 种值(付费、未付费和其他)。
我想根据状态制作每行的背景,如果它是未付款的颜色是红色,如果它的付费颜色是绿色,而在其他选项中它是白色或没有颜色。
我从 mysql 数据库接收数据。
我的数据网格 XML 代码:
<DataGrid HorizontalAlignment="Right" Height="178" FontWeight="Bold" Margin="0,193,63,0" VerticalAlignment="Top" Width="1087" x:Name="FactorGrid" ItemsSource="{Binding LoadDataBinding}" CanUserResizeRows="False" AutoGenerateColumns="False" CanUserAddRows="False" ContextMenuOpening="FactorGrid_ContextMenuOpening">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding id}" Header="شماره صورتحساب" Width="110" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding factorgroup}" Header="گروه" Width="100" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding factortype}" Header="نوع" Width="100" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding amount}" Header="مبلغ" Width="80" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding discount}" Header="تخفیف" Width="80" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding extra}" Header="جریمه" Width="80" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding created_at, ConverterCulture=fa-IR, StringFormat=yyyy/MM/dd}" Header="تاریخ ایجاد" Width="150" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding parent_id}" Header="شماره صورتحساب اصلی" Width="150" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding status}" Header="وضعیت" Width="150" IsReadOnly="True" />
</DataGrid.Columns>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="پرداخت شده" Click="BtnSetPaid">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/yes.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="پرداخت صورتحساب" Click="BtnAddNewpay_Click">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/9999.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="حذف" Click="BtnFactorDell">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/delete.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="قسط بندی" Click="BtnFactorSplit">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/ab-report.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="ویرایش" Click="BtnFactorEdit">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/Edit.png"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
和我的 cs 代码:
MySqlCommand cmd3 = new MySqlCommand("SELECT query ", conn);
MySqlDataAdapter adp2 = new MySqlDataAdapter(cmd3);
DataSet ds2 = new DataSet();
adp2.Fill(ds2, "LoadDataBinding");
FactorGrid.DataContext = ds2;
有什么办法可以做我想做的事吗?抱歉我的英语不好。
查看 DataTriggers。它们可以帮助您绑定到一个值,并根据不同的值做不同的事情。您通常会在 和 之间添加它。更改颜色 RGB 以适合。
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding Status}" Value="Paid">
<Setter Property="Background" Value="#447cff8b"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="Unpaid">
<Setter Property="Background" Value="#444eafff"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
如果不满足其他条件,在您进一步提问(在评论中)关于 默认值 值之后,您只需再添加一行:
<Setter Property="Background" Value="#4400ffff"></Setter>
这超出了这样的样式触发器(第 3 行):
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="#4400ffff"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Status}" Value="Paid">
<Setter Property="Background" Value="#447cff8b"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="Unpaid">
<Setter Property="Background" Value="#444eafff"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
这样一来,如果触发了其中一个触发器,它将使用触发器的颜色,否则将使用默认值(上面的第 3 行)。
我有 Datagrid 视图,如下所示:
<DataGrid HorizontalAlignment="Right" Height="178" FontWeight="Bold" Margin="0,193,63,0" VerticalAlignment="Top" Width="1087" x:Name="FactorGrid" ItemsSource="{Binding LoadDataBinding}" CanUserResizeRows="False" AutoGenerateColumns="False" CanUserAddRows="False" ContextMenuOpening="FactorGrid_ContextMenuOpening">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding id}" Header="شماره صورتحساب" Width="110" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding factorgroup}" Header="گروه" Width="100" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding factortype}" Header="نوع" Width="100" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding amount}" Header="مبلغ" Width="80" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding discount}" Header="تخفیف" Width="80" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding extra}" Header="جریمه" Width="80" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding created_at, ConverterCulture=fa-IR, StringFormat=yyyy/MM/dd}" Header="تاریخ ایجاد" Width="150" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding parent_id}" Header="شماره صورتحساب اصلی" Width="150" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding status}" Header="وضعیت" Width="150" IsReadOnly="True" />
</DataGrid.Columns>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="پرداخت شده" Click="BtnSetPaid">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/yes.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="پرداخت صورتحساب" Click="BtnAddNewpay_Click">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/9999.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="حذف" Click="BtnFactorDell">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/delete.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="قسط بندی" Click="BtnFactorSplit">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/ab-report.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="ویرایش" Click="BtnFactorEdit">
<MenuItem.Icon>
<Image Width="12" Height="12" Source="img/Edit.png"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
和我的 cs 代码:
MySqlCommand cmd3 = new MySqlCommand("SELECT query ", conn);
MySqlDataAdapter adp2 = new MySqlDataAdapter(cmd3);
DataSet ds2 = new DataSet();
adp2.Fill(ds2, "LoadDataBinding");
FactorGrid.DataContext = ds2;
有什么办法可以做我想做的事吗?抱歉我的英语不好。
查看 DataTriggers。它们可以帮助您绑定到一个值,并根据不同的值做不同的事情。您通常会在 和
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding Status}" Value="Paid">
<Setter Property="Background" Value="#447cff8b"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="Unpaid">
<Setter Property="Background" Value="#444eafff"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
如果不满足其他条件,在您进一步提问(在评论中)关于 默认值 值之后,您只需再添加一行:
<Setter Property="Background" Value="#4400ffff"></Setter>
这超出了这样的样式触发器(第 3 行):
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="#4400ffff"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Status}" Value="Paid">
<Setter Property="Background" Value="#447cff8b"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="Unpaid">
<Setter Property="Background" Value="#444eafff"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
这样一来,如果触发了其中一个触发器,它将使用触发器的颜色,否则将使用默认值(上面的第 3 行)。