Изменение стиля ячейки WPF DataGrid после обновления
-
21-12-2019 - |
Вопрос
У меня есть DataGrid с динамически генерируемыми столбцами, и мне нужно изменить стиль ячеек, значения которых изменились после некоторых манипуляций.
ItemsSource для DataGrid определяется как List<MyTableRow>
, где
public class MyTableRow
{
private string[] _values;
private string _rowHeader;
// getters and setters here
}
Столбцы DataGrid генерируются с помощью следующего кода:
for (int i = 0; i < source[0].Values.Length; i++)
{
var col = new DataGridTextColumn();
var binding = new Binding("Values[" + i + "]");
col.Binding = binding;
col.CanUserSort = false;
this.dataGrid.Columns.Add(col);
this.dataGrid.Columns[i].Header = columnNames[i];
}
Результирующий DataGrid выглядит так этот
Проблема возникает, когда я пытаюсь выделить (жирным текстом или цветным фоном) ячейки, значения которых в ItemsSource изменились.В этот момент мой вопрос распадается на два:
- Есть ли какой-то «встроенный» способ сделать что-то с измененными ячейками?(возможно, с
ObservableColletion
или что-то еще) - Если нет, как я могу выделить отдельные ячейки на основе их индексов или их значений?
Я пытался сделать это с помощью стилей и/или триггеров xaml, но оказалось, что я не знаю, какое значение следует передать конвертеру.
<Style TargetType="TextBlock">
<Setter Property="Background"
Value="{Binding <!-- some proper binding here -->,
Converter={StaticResource ValueToBrushConverter}}"/>
</Style>
Другие решения, найденные в SO, либо имеют ту же «проблему» с привязкой, либо просто не работают.Что я могу сделать, чтобы выделить только один ячейка, а не целая строка/столбец?Я могу изменить ItemsSource, MyTableRow
код генерации полей и/или столбцов, если необходимо
Кто-нибудь может мне помочь?Прошло несколько дней с тех пор, как я застрял с этой проблемой
ОБНОВЛЯТЬ Найдено решение
Решение
Наконец-то узнаю, как сделать то, что я хочу.Решение немного «грязное», но у меня работает нормально.Я добавил неразрывный пробел в каждую ячейку, которую мне нужно выделить.
private const string NBSP = "\u00A0"
После этого остается только создать преобразователь значений.Поэтому я добавил MultiBinding
в моем XAML:
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Background">
<Setter.Value>
<MultiBinding Converter="{StaticResource ValueToBrushMultiConverter}" >
<MultiBinding.Bindings>
<Binding RelativeSource="{RelativeSource Self}" />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}" />
</MultiBinding.Bindings>
</MultiBinding
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
Конвертер определяется как:
public class ValueToBrushMultiConverter : IMultiValueConverter
{
private const string NBSP = "\u00A0";
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var cell = (DataGridCell)values[0];
var dgRow = (DataGridRow)values[1];
var test = (dgRow.Item as TableRow<string, string>).Values[cell.Column.DisplayIndex];
if (test.Contains(NBSP))
return System.Windows.Media.Brushes.PaleGreen;
return DependencyProperty.UnsetValue;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
Надеюсь, это кому-то поможет!