使用 WPF C# 更改数据网格颜色时出现问题
Problems changing datagrid color using WPF C#
我正在使用数据网格并根据行的条件更改行的颜色,并且我正在以编程方式执行此操作。
根据例子
因为我的数据网格绑定到数据表,所以我直接从数据表加载信息
private void UpdateCor () {
gvDados.UpdateLayout ();
for (int i = 0; i <dt.Rows.Count; i ++)
{
var rowContext = (DataGridRow)
gvDados.ItemContainerGenerator.ContainerFromIndex (i);
if (rowContext! = null)
{
if (dt.Rows [i] ["situation"]. ToString (). Equals (1))
rowContext.Background = Brushes.Green;
else
rowContext.Background = Brushes.Red;
}
}
}
有了这个,我可以更新网格的颜色,尽管这不是最好的方法。我的问题是,每当我使用滚动条向下或向上移动时,颜色就会过时。我如何防止这种情况发生?即使我滚动条,颜色也保持不变?
这是一个与 this question 类似的问题。
可以使用 datatrigger:
<DataGrid ItemsSource="{Binding YourItemsSource}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="State1">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="State2">
<Setter Property="Background" Value="Green"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
通常,XAML 太简单了,无法表达更复杂的条件。我更喜欢将哪些值应该使用哪些颜色的逻辑放入转换器中。这使 C# 中的转换器更简单 XAML 并具有更大的灵活性。
<datagrid.rowstyle>
<style targettype="DataGridRow">
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self},
Path=Item.situation, Converter={StaticResource ValueToBackgroundConverter}}"/>
</style>
</datagrid.rowstyle>
在 C# 中:
class ValueToBackgroundConverter: IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
if (value is int) {
int quantity = (int)value;
if (quantity>=100) return Brushes.White;
if (quantity>=10) return Brushes.WhiteSmoke;
if (quantity>=0) return Brushes.LightGray;
return Brushes.White; //quantity should not be below 0
}
//value is not an integer. Do not throw an exception
// in the converter, but return something that is obviously wrong
return Brushes.Yellow;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
}
格式化 WPF 数据网格的各个部分是出了名的困难,Microsoft 没有提供如何进行格式化的必要信息。阅读我的文章 Codeproject: Guide to WPF DataGrid formatting using binding 以更好地了解如何轻松做到这一点。
我正在使用数据网格并根据行的条件更改行的颜色,并且我正在以编程方式执行此操作。 根据例子 因为我的数据网格绑定到数据表,所以我直接从数据表加载信息
private void UpdateCor () {
gvDados.UpdateLayout ();
for (int i = 0; i <dt.Rows.Count; i ++)
{
var rowContext = (DataGridRow)
gvDados.ItemContainerGenerator.ContainerFromIndex (i);
if (rowContext! = null)
{
if (dt.Rows [i] ["situation"]. ToString (). Equals (1))
rowContext.Background = Brushes.Green;
else
rowContext.Background = Brushes.Red;
}
}
}
有了这个,我可以更新网格的颜色,尽管这不是最好的方法。我的问题是,每当我使用滚动条向下或向上移动时,颜色就会过时。我如何防止这种情况发生?即使我滚动条,颜色也保持不变?
这是一个与 this question 类似的问题。 可以使用 datatrigger:
<DataGrid ItemsSource="{Binding YourItemsSource}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="State1">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="State2">
<Setter Property="Background" Value="Green"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
通常,XAML 太简单了,无法表达更复杂的条件。我更喜欢将哪些值应该使用哪些颜色的逻辑放入转换器中。这使 C# 中的转换器更简单 XAML 并具有更大的灵活性。
<datagrid.rowstyle>
<style targettype="DataGridRow">
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self},
Path=Item.situation, Converter={StaticResource ValueToBackgroundConverter}}"/>
</style>
</datagrid.rowstyle>
在 C# 中:
class ValueToBackgroundConverter: IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
if (value is int) {
int quantity = (int)value;
if (quantity>=100) return Brushes.White;
if (quantity>=10) return Brushes.WhiteSmoke;
if (quantity>=0) return Brushes.LightGray;
return Brushes.White; //quantity should not be below 0
}
//value is not an integer. Do not throw an exception
// in the converter, but return something that is obviously wrong
return Brushes.Yellow;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
}
格式化 WPF 数据网格的各个部分是出了名的困难,Microsoft 没有提供如何进行格式化的必要信息。阅读我的文章 Codeproject: Guide to WPF DataGrid formatting using binding 以更好地了解如何轻松做到这一点。