У меня проблема с производительностью в WPF DataGrid (.net 4.0). Сначала
, некоторые детали:
- У меня есть сетка данных с наблюдаемой коллекцией как ItemsSource.
- эта observableCollection сама содержит коллекции объектов, каждая коллекция, следовательно, является строкой, каждый объект является ячейкой («логическая» ячейка, конечно, не фактическая dataGridCell)
причина, по которой я это делаюэто потому, что я знаю только во время выполнения, сколько столбцов у меня будет в моей dataGrid.
- , тогда я привязываю значение каждого DataGridCell к значению объекта в «логической» таблице (= коллекцияколлекции)
теперь у меня проблема в том, что я также должен иметь возможность изменять любые свойства ячейки (например, Background, Foreground, FontFamily и т. д.) в любое время, пока приложение работает.
Решение, которое я придумал, заключается в том, чтобы установить для ячеек стиля столбцов привязки, которые связываются со свойствами "логических" ячеек
здесь IПример кода (в моем приложении нет 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 (виртуализация строк в моем случае не требуется), для загрузки сетки требуется около 2 секунд, изатем 1 с каждый раз, когда я перемещаю горизонтальную полосу прокрутки большим скачком (щелкает полосу прокрутки bg, а не стрелку)
, это слишком много для моей цели
, поэтому мой вопрос: ячто-то не так и если да, то что?какой лучший способ сделать это у меня есть?
спасибо за чтение