我对WPF数据网格(.net 4.0)有性能问题
首先,一些细节:
-
我有一个数据网格,其中一个可观察的集合是ItemsSource。
-
这个observableCollection本身包含对象的集合,每个集合都是一行,每个对象都是一个单元格(当然是“逻辑”单元格,而不是实际的dataGridCell)
之所以这样做,是因为我只知道在运行时,我的数据网格中将有多少列。
-
然后我将每个DataGridCell的值绑定到“logical”表中对象的值(=集合集合)
现在的问题是,我还必须能够在应用程序运行时随时更改任何单元格的属性(如背景、前景、字体系列等)。
我提出的解决方案是使用绑定到“逻辑”单元格属性的绑定来设置列的单元格样式
下面是一个示例代码(我的应用程序中没有Xaml):
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Width = 1200;
Height = 780;
Top = 60;
Left = 200;
DataGrid dg = new DataGrid();
Content = dg;
ObservableCollection<Row> Source = new ObservableCollection<Row>();
dg.ItemsSource = Source;
dg.SelectionMode = DataGridSelectionMode.Extended;
dg.IsSynchronizedWithCurrentItem = true;
dg.CanUserSortColumns = false;
dg.CanUserReorderColumns = true;
dg.CanUserResizeColumns = true;
dg.CanUserResizeRows = true;
dg.CanUserAddRows = false;
dg.CanUserDeleteRows = false;
dg.AutoGenerateColumns = false;
dg.EnableColumnVirtualization = true;
dg.EnableRowVirtualization = false; // unuseful in my case : I alawys have less lines than the DG can contain
dg.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
dg.GridLinesVisibility = DataGridGridLinesVisibility.None;
dg.HorizontalGridLinesBrush = Brushes.LightGray;
dg.MinRowHeight = 20;
dg.RowHeaderWidth = 20;
for (int i = 0; i < 100; i++)
{
DataGridTextColumn column = new DataGridTextColumn();
column.Binding = new Binding(String.Format(CultureInfo.InvariantCulture, "[{0}].Text", i));
Style style = new Style(typeof(DataGridCell));
style.Setters.Add(new Setter(DataGridCell.BackgroundProperty, new Binding(String.Format(CultureInfo.InvariantCulture, "[{0}].Background", i))));
style.Setters.Add(new Setter(DataGridCell.ForegroundProperty, new Binding(String.Format(CultureInfo.InvariantCulture, "[{0}].Foreground", i))));
column.CellStyle = style;
column.Header = "Column " + i;
dg.Columns.Add(column);
}
for (int i = 0; i < 35; i++)
{
Row dgRow = new Row();
Source.Add(dgRow);
for (int j = 0; j < 100; j++)
dgRow.Add(new TextBox() { Text = "cell " + i + "/" + j, Background = Brushes.AliceBlue, Foreground = Brushes.BlueViolet });
}
}
}
public class Row : ObservableCollection<TextBox>
{
}
我的问题是:当volumnvirtualization打开时(在我的例子中,我不需要行虚拟化),网格需要大约2秒的时间加载,然后每次我大步移动水平滚动条时需要1秒(滚动条bg中的clic,而不是箭头)
这对我来说太过分了
所以我的问题是:我做错了什么,如果错了,怎么办?我还有什么更好的办法?
谢谢你的阅读