c# - 带有 AutoGenerateColumns 和 Cellbackground 的 C# wpf Datagrid
问题描述
我有一个 WPF 应用程序,其 DataGrid 连接到不同的 .ItemsSource,构建列,工作正常。
大多数情况下,第一列具有某种 ID 来查询后端数据。我想根据后端数据用不同的颜色为每行的一些单元格着色。
问题:我的 IValueConverter 没有提供我所在的行。因此,在单元格着色事件中,我得到了该单元格的内容,但我发现无法访问该行第一列中的 ID...
任何将我推向正确方向的事情都将不胜感激。
我准备了一些工作演示代码,可以复制/粘贴到新的 wpf-app 中:
XAML
<Window x:Class="Datagridtest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Datagridtest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<DataGrid x:Name="dgrid" HorizontalAlignment="Left" Height="255" Margin="98,74,0,0" VerticalAlignment="Top" Width="615"/>
</Grid>
</Window>
.cs 代码
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
namespace Datagridtest
{
public class Data
{
public string id { get; set; }
public string name { get; set; }
public string location { get; set; }
}
public class DataConti
{
public List<Data> daten = new List<Data>();
public void MakeDummy()
{
var rand = new Random();
for (int i = 0; i < 20; i++)
{
Data d = new Data
{
name = "egal" + i.ToString(),
location = "egal" + i.ToString()
};
d.id = rand.Next(1000).ToString();
daten.Add(d);
}
}
}
class ValueConverterConti
{
public DataConti conti { get; set; }
public DataGridColumn col { get; set; }
}
class VC : IValueConverter // IMultiValueConverter?
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
ValueConverterConti c = (ValueConverterConti)parameter;
SolidColorBrush sb = Brushes.White;
if (c.col.DisplayIndex == 1)
{
// all with id%3==0--> Blue
sb = Brushes.LightBlue;
}
else
if (c.col.DisplayIndex == 2)
{
// all with id%2==0--> Yellow
sb = Brushes.Yellow;
}
return sb;
}
public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public partial class MainWindow : Window
{
DataConti dataconti = new DataConti();
void DataGridAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
VC vc = new VC()
{
// ?
};
ValueConverterConti dc = new ValueConverterConti
{
col = e.Column,
conti = dataconti
};
Style style = new Style(typeof(DataGridCell));
style.Setters.Add(new Setter(DataGridCell.BackgroundProperty,
new Binding(e.PropertyName)
{
Converter = vc,
ConverterParameter = dc
}));
e.Column.CellStyle = style;
}
public MainWindow()
{
InitializeComponent();
dataconti.MakeDummy();
dgrid.AutoGenerateColumns = true;
dgrid.AutoGeneratingColumn += DataGridAutoGeneratingColumn;
dgrid.ItemsSource = dataconti.daten;
}
}
}
解决方案
所以解决这个问题的方法是使用MultiBinding。
public class QuantityToBackgroundConverterM : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
SolidColorBrush sb = Brushes.White;
try
{
if (values[0] != DependencyProperty.UnsetValue)
{
int i = System.Convert.ToInt32(values[0]);
string column = (string)values[1];
switch (column)
{
case "name":
if (i % 2 == 0) { sb = Brushes.LightBlue; }
break;
case "location":
if (i % 3 == 0) { sb = Brushes.Yellow; }
break;
}
}
}
catch (Exception){}
return sb;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public partial class MainWindow : Window
{
DataConti dataconti = new DataConti();
void DataGridAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
Binding bid = new Binding();
bid.Path = new PropertyPath("id");
Binding bheadername = new Binding();
bheadername.Source = e.Column.Header as String;
Binding bcolumn = new Binding();
bcolumn.Path = new PropertyPath(e.Column.Header as String);
MultiBinding binder = new MultiBinding();
binder.Bindings.Add(bid);
binder.Bindings.Add(bheadername);
binder.Bindings.Add(bcolumn);
binder.Converter = new QuantityToBackgroundConverterM();
Setter setter = new Setter(DataGridRow.BackgroundProperty, binder);
Style style = new Style(typeof(DataGridCell));
style.Setters.Add(setter);
e.Column.CellStyle = style;
}
推荐阅读
- java - 即使字符串受到限制,字符串索引也超出范围
- mysql - 如何在 MySQL 中一次为多个列设置多个默认约束?
- entity-framework - 在 EF(实体框架)中,在乘法应用中更改 INT 和 SMALLINT 之间的字段类型的策略是什么?
- python - python iterable是否意味着可数?
- sql - PL/SQL: ORA-00904: 无效标识符 &PL/SQL: 语句被忽略&PLS-00364: 循环索引变量使用无效
- spring-boot - 未为参数对象调用 Spring Boot 异常处理程序
- c++ - 花括号初始化程序后的向量 push_back 在 C++ 中不起作用
- mysql - 由于 SSL 问题,无法通过 docker-compose 将 Keycloak 连接到 MySQL
- c# - 我想用方形网格统一绘制游戏板,我是初学者
- python - training.test.split 返回空的训练集