Вопрос

У меня есть 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 изменились.В этот момент мой вопрос распадается на два:

  1. Есть ли какой-то «встроенный» способ сделать что-то с измененными ячейками?(возможно, с ObservableColletion или что-то еще)
  2. Если нет, как я могу выделить отдельные ячейки на основе их индексов или их значений?

Я пытался сделать это с помощью стилей и/или триггеров 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();
        }
    }

Надеюсь, это кому-то поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top