C#Silverlight Datagrid - 行颜色更改

时间:2009-10-02 14:03:32

标签: c# silverlight datagrid row

如何更改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 个答案:

答案 0 :(得分:6)

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事件取消设置您设置的样式。

答案 1 :(得分:5)

我有同样的问题,并在进行了最小化测试和一些演绎推理后想出来了!

  

基本上解决方案是总是   确保设置背景颜色(或任何样式)。   不要假设行样式的任何默认值。我在假设   默认为白色 - 这是一个   合理的假设但事实并非如此。

更多详情:

看起来运行时在渲染多行时会重用Ro​​w类的实例。我根本没有证实这一点,但从似乎必须发生的症状来判断。

我只有一两排不同的颜色。当我上下滚动时,我看到随机颜色的行。

这是我制作的测试课程。每隔五行应该是红色和斜体。

你会看到一些注释掉的行(设置默认的非斜体和白色背景)。随着这些注释 - 如果你上下滚动你会看到很多红色!!这是因为正在重用行对象。如果你让窗户变小,然后最大化它,一些白色会回来。可能是垃圾收集器收集行,它们认为在使窗口变小之后你不再需要它了。

如上所述,解决方案是始终为默认值指定样式,并且不假设任何默认值。

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; }
    }
}

答案 2 :(得分:3)

我在此之后:

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);
        }

答案 3 :(得分:0)

执行此操作的最佳方法是更改​​DataGrid上的RowStyle。这需要大量的xaml,但您可以从here复制它并更改其中的一些样式。

此外,如果您需要根据行数更改行颜色,则可以在样式中将样式中的绑定添加到数据上。

他们打开了Reflector并从System.Windows.Controls.Data.dll获取了DataGrid的generic.xaml,然后写了一些新的xaml来改变它。

答案 4 :(得分:0)

它对我有用。 =)

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;
        }
    }