Goo*_*ber 7 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);
}
Run Code Online (Sandbox Code Playgroud)
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事件取消设置您设置的样式.
我有同样的问题,并在做了一个最小的测试和一些演绎推理后想出来了!
基本上解决方案是始终 确保您设置背景颜色(或任何样式). 不要假设行样式的任何默认值.我假设默认为白色 - 这是一个合理的假设,但事实并非如此.
更多细节:
看起来运行时在渲染多行时会重用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; }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32055 次 |
| 最近记录: |