У меня есть проблемы с производительностью, с WPF DataGrid (.net 4.0)DataGrid Cell.Style связывание
первым, некоторыми деталями:
- У меня есть DataGrid с наблюдаемой коллекцией как ItemsSource.
- это сама ObservableCollection содержит коллекции объектов, каждую коллекцию, следовательно, является строкой, каждый объект является клеткой («логическая» ячейка, конечно, а не фактическое dataGridCell)
причины, почему я делаю это потому, что я только знаю во время выполнения, сколько столбцов у меня будет в моем dataGrid.
- я связать значение каждого DataGridCell в величину объекта в «логической» таблицы (= коллекция коллекций)
Теперь проблема у меня есть, что я должен быть в состоянии изменить любые свойства ячейки (например, Background, Foreground, FontFamily и т. д.) в любое время, пока приложение запущено.
Решения, которое я придумал это один с участием установки cellStyles с креплениями, которые связываются с „Логической“ клеткой столбцы свойств
здесь пример кода (не 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>
{
}
моя проблема: с VolumnVirtualisation On (мне не нужна строка виртуализации в моем случае), сетка занимает около 2 секунд для загрузки, а затем 1сек каждый раз, когда я перемещаю горизонтальную полосу прокрутки большим прыжком (clic in scrollBar bg, а не стрелка)
t его слишком много для моей цели
так что мой вопрос: я делаю что-то неправильно, и если да, то что? какой лучший способ сделать это у меня есть?
спасибо за чтение
благодарит за ваш ответ. У меня есть вопрос: как шаблон шаблона будет лучше, чем стиль для каждой ячейки? (Я бы подумал, что это была полная противоположность) – David 2010-11-23 17:03:10
Потому что у DataGridTextColumn уже есть шаблон, поэтому столбец с шаблоном лучше, чем столбец с шаблоном и стилем. По крайней мере, я так думаю, и это логично для меня. – vorrtex 2010-12-03 15:07:59