0

私の WPF アプリケーションでは、動的な列数でデータグリッドを生成します。コードの一部:

for (var i = datetime; i < datetime.AddDays(1); i+= TimeSpan.FromHours(1)){
    var column = new DataGridTemplateColumn();
    column.Header = (i+1).ToString();
    column.CellTemplate = (DataTemplate)XamlReader.Load(
            new MemoryStream(Encoding.Default.GetBytes(
                @"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'><TextBlock Text='{Binding Values[" + i + @"]." + propName + @"}'/></DataTemplate>"
            ))); 
    column.CellEditingTemplate = (DataTemplate)XamlReader.Load(
            new MemoryStream(Encoding.Default.GetBytes(
                @"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'><TextBox Text='{Binding Values[" + i + @"]." + propName + @", Mode=TwoWay}'/></DataTemplate>"
            ))); 
    dataGrid1.Columns.Add(column);
}
dataGrid1.ItemsSource = data;

<DataGrid EnableColumnVirtualization="true" EnableRowVirtualization="true" Name="dataGrid1" DockPanel.Dock="Top" AutoGenerateColumns="False" 
                   Height="120" Width="Auto" />

テーブルに 25 列と 10 行が含まれている場合、レンダリングが遅すぎます (1 秒)。データバインディングのパフォーマンスを改善するにはどうすればよいですか?

4

1 に答える 1

1

すべての列に同じデータ テンプレート インスタンスを使用する必要があります。

XamlReader.Load()呼び出しをループの外に移動し、すべての列に同じインスタンスを使用するだけです。

var cellTemplate = (DataTemplate)XamlReader.Load(...);
var cellEditTemplate = (DataTemplate)XamlReader.Load(...);
for(...)
{
   //..
   column.CellTemplate = cellTemplate;
   column.CellEditingTemplate = cellEditTemplate;
   //...
}
于 2012-07-03T10:50:20.773 に答える