Magnus MontinがMicrosot WPF Forum で質問を解決しました:
AutoGeneratedColumns
現実のシナリオではめったに役に立ちません。AutoGeneratingColumn
ただし、イベントを処理することもできます。
<DataGrid Name="dataGrid" AutoGenerateColumns="True" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />
private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
e.Column = new DataGridTextColumn() { Header = e.PropertyName, Binding = new Binding("[" + e.PropertyName + "]") };
}
とにかく、この種のビュー関連のコードは確かにビューに属しています。ビュー モデルは、DataGrid コントロールが何らかの理由で実際のデータを表示できないという事実を知りませんし、気にもしません。これはビューで修正する必要があり、修正する必要があります。
それは魅力のように機能します!私の例は機能し始めました:
XAML:
<DataGrid ColumnWidth="35" ItemsSource="{Binding EmployeeDataTable,
IsAsync=True}" VirtualizingStackPanel.IsVirtualizing="true"
EnableRowVirtualization="True" EnableColumnVirtualization="True"
MaxWidth="2560" MaxHeight="1600"
VirtualizingStackPanel.VirtualizationMode="Recycling"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"/>
コードビハインド:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
e.Column = new DataGridTextColumn() {
Header = e.PropertyName,
SortMemberPath = e.PropertyName, //To allow for sorting on a column
Binding = new Binding("[" + e.PropertyName + "]")
};
}
ビューモデル:
private DataTable employeeDataTable;
public DataTable EmployeeDataTable
{
get { return employeeDataTable; }
set
{
employeeDataTable = value;
OnPropertyChanged("EmployeeDataTable");
}
}
private void PopulateDataTable()
{
var _ds = new DataSet("Test");
employeeDataTable = new DataTable();
employeeDataTable = _ds.Tables.Add("DT");
for (int i = 0; i < 800; i++)
{
if(i%2==0)
employeeDataTable.Columns.Add(i.ToString() + ".");
else
employeeDataTable.Columns.Add(i.ToString() + "/");
}
for (int i = 0; i < 2; i++)
{
var theRow = employeeDataTable.NewRow();
for (int j = 0; j < 800; j++)
{
if (j % 2 == 0)
{
//theRow[j] = j.ToString();
theRow[j] = "a";
}
else
theRow[j] = CreateDoubleValue(j).ToString();
}
employeeDataTable.Rows.Add(theRow);
}
}