Изменение цвета строки WPF Datagrid

У меня есть WPF datagrid, который заполнен ObserverableCollection.

теперь я хочу покрасить строки в зависимости от содержимого строки при запуске программы и если что-то изменится во время выполнения.

System.Windows.Controls.DataGrid areaDataGrid = ...;
ObservableCollection<Area> areas;
//adding items to areas collection
areaDataGrid.ItemsSource = areas;

areaDataGrid.Rows  <-- Property not available. how to access rows here?

CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(areaDataGrid.Items);
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(areaDataGrid_Changed);
...

void areaDataGrid_Changed(object sender, NotifyCollectionChangedEventArgs e)
{
    //how to access changed row here?
}

Как я могу получить доступ к строкам в start и runtime?

2 ответов


использовать RowStyle. Вы можете использовать Triggers чтобы изменить цвет условно, или просто привязать его к Brush свойство для ваших элементов и измените это свойство соответственно.


чтобы изменить его через код вместо триггера, он может выглядеть примерно так, как показано ниже. Вы можете получить доступ к данным в виде массива, а затем сравнить его. В этом примере я сравниваю 4-й столбец, чтобы увидеть, больше ли он 0, и 5-й столбец, чтобы увидеть, меньше ли он 0, иначе просто нарисуйте его цвет по умолчанию. Попробуйте / поймайте его там, потому что нужно добавить некоторую логику, чтобы увидеть, является ли это допустимой строкой или нет.....или вы можете просто игнорировать ошибки, как показано ниже (не очень хорошая практика, хотя), но должен использоваться как есть.

    private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        try
        {
            if (Convert.ToDouble(((System.Data.DataRowView)(e.Row.DataContext)).Row.ItemArray[3].ToString()) > 0)
            {
                e.Row.Background = new SolidColorBrush(Colors.Green);
            }
            else if (Convert.ToDouble(((System.Data.DataRowView)(e.Row.DataContext)).Row.ItemArray[4].ToString()) < 0)
            {
                e.Row.Background = new SolidColorBrush(Colors.Red);
            }
            else
            {
                e.Row.Background = new SolidColorBrush(Colors.WhiteSmoke);
            }
        }
        catch
        {
        } 
    }