C # Silverlight Datagrid - изменение цвета строки - PullRequest
7 голосов
/ 02 октября 2009

Как изменить цвет строк сетки данных Silverlight?!

Я пробовал это, но, похоже, это не работает так, как я хочу ... Случайные строки окрашиваются неправильно:

 void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            var c = e.Row.DataContext as Job;
            if (c != null && c.Status.Contains("complete"))
                e.Row.Background = new SolidColorBrush(Colors.Green);
            else
                e.Row.Background = new SolidColorBrush(Colors.Red);
        }

Ответы [ 5 ]

6 голосов
/ 18 октября 2010

Документация Microsoft:

Для повышения производительности свойство EnableRowVirtualization имеет вид по умолчанию установлено значение true. Когда свойство EnableRowVirtualization имеет значение при значении true DataGrid не создает экземпляр объекта DataGridRow для каждый элемент данных в связанном источнике данных. Вместо этого DataGrid создает DataGridRow объекты только тогда, когда они необходимы, и использует их столько, сколько это Можно. Например, DataGrid создает объект DataGridRow для всех данных. элемент, который в данный момент просматривается и перезагружает строку при прокрутке зрения.

источник: http://msdn.microsoft.com/en-gb/library/system.windows.controls.datagrid.unloadingrow.aspx

это объясняет поведение, которое вы испытывали

Правильное (хотя и не простое, как я признаю) решение состоит в том, чтобы, следовательно, использовать событие UnloadingRow для отмены установленного вами стиля.

5 голосов
/ 17 января 2010

У меня была такая же проблема, и я понял ее после минимального теста и некоторых дедуктивных рассуждений!

В основном решение состоит в том, чтобы ВСЕГДА убедитесь, что вы установили цвет фона (или любой другой стиль). Не принимать значения по умолчанию для стиля строки . Я предполагал по умолчанию белый - который является разумное предположение, но на самом деле это не так.

Подробнее:

Похоже, что среда выполнения повторно использует экземпляры класса Row при рендеринге нескольких строк. Я вообще этого не проверял, но, судя по симптомам, это должно происходить.

У меня был только один или два ряда, которые должны быть окрашены по-разному. При прокрутке вверх и вниз я видел случайно окрашенные строки.

Вот мой тестовый класс, который я сделал. Каждый пятый ряд должен быть красным и курсивом.

Вы увидите закомментированную пару строк (которые устанавливают по умолчанию не курсив и белый фон). С этими комментариями - если вы прокрутите вверх и вниз, вы увидите много красного! Это потому, что объекты строк используются повторно. Если вы сделаете окно меньше, а затем увеличите его, часть белого вернется. Вероятно, сборщик мусора собирает строки, которые, как он думает, вам больше не понадобятся после уменьшения размера окна.

Как я уже говорил выше, решение состоит в том, чтобы всегда указывать стили для значений по умолчанию и не принимать никаких значений по умолчанию.

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        dataGrid1.ItemsSource = Enumerable.Range(0, 50).Select(x => new Person()
        {
            FirstName = "John",
            LastName = "Smith",
            ID = x,
            Delinquent = (x % 5 == 0)     // every fifth person is 'delinquent'
        });
    }

    private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        var person = (Person)e.Row.DataContext;

        if (person.Delinquent)
        {
            e.Row.Background = new SolidColorBrush(Colors.Red);
            e.Row.Foreground = new SolidColorBrush(Colors.White);
            e.Row.FontStyle = FontStyles.Italic;
        }

        else
        {
           // defaults - without these you'll get randomly colored rows
           // e.Row.Background = new SolidColorBrush(Colors.Green);
           // e.Row.Foreground = new SolidColorBrush(Colors.Black);
           // e.Row.FontStyle = FontStyles.Normal;
        }

    }

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int ID { get; set; }
        public bool Delinquent { get; set; }
    }
}
3 голосов
/ 02 октября 2009

Я был после этого:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            DataGridRow row = e.Row;
            var c = row.DataContext as Job;         
            if (c != null && c.Status.Contains("omplete"))
                e.Row.Foreground = new SolidColorBrush(Colors.Green);
            else
                e.Row.Foreground = new SolidColorBrush(Colors.Red);
        }
0 голосов
/ 06 октября 2014

Это работает для меня. =) * * Тысяча одна

private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        var row = e.Row.GetIndex();
        if (row % 2 == 0)
        {
            e.Row.Background = new SolidColorBrush(Colors.Red);
            e.Row.Foreground = new SolidColorBrush(Colors.White);
            e.Row.FontStyle = FontStyles.Italic;
        }

        else
        {
            // defaults - without these you'll get randomly colored rows
            e.Row.Background = new SolidColorBrush(Colors.Green);
            e.Row.Foreground = new SolidColorBrush(Colors.Black);
            e.Row.FontStyle = FontStyles.Normal;
        }
    }
0 голосов
/ 23 марта 2011

Лучший способ сделать это - изменить RowStyle в вашей DataGrid. Это требует большого количества xaml, но вы можете просто скопировать это из здесь и изменить несколько стилей в нем.

Кроме того, если вам нужно изменить цвет строки на основе данных строки, вы можете добавить привязку в свойстве «Стиль» к свойству «Кисть» в ваших данных.

Они открыли Reflector и взяли файл generic.xaml для DataGrid из System.Windows.Controls.Data.dll, а затем написали новый xaml для его изменения.

...