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

У меня есть сетка данных WPF, заполненная 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?
}

Как мне получить доступ к строкам при запуске и во время выполнения?


person juergen d    schedule 07.04.2012    source источник


Ответы (2)


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

person H.B.    schedule 07.04.2012

Чтобы изменить его с помощью кода вместо триггера, он может выглядеть примерно так, как показано ниже. Вы можете получить доступ к данным как к массиву, а затем сравнить их. В этом примере я сравниваю 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
        {
        } 
    }
person itman    schedule 30.11.2012
comment
как использовать метод события загрузки? - person Klasik; 13.03.2020