Генерация столбцов динамически в WPF DataGrid? - PullRequest
4 голосов
/ 25 августа 2010
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
  </DataGrid.Columns>
</DataGrid>

В приведенном выше фрагменте столбцы DataGrid жестко заданы в XAML.

Возможно ли, чтобы определения столбцов были определены в другом месте, в идеале в MVVM View-Model, чтобы столбцы можно было определять и переопределять на лету?

Ответы [ 3 ]

3 голосов
/ 02 сентября 2010

Использование Microsoft DataGrid с шаблоном MVVM следующим образом работает для меня, потому что DataGrid автоматически генерирует столбцы на основе DataTable.

В XAML я включаю DataGrid:

<WpfToolkit:DataGrid 
    ItemsSource="{Binding Path=GridData, Mode=OneWay}" > 
</WpfToolkit:DataGrid> 

На мой взгляд модель выставляю DataView:

public DataView GridData 
{ 
  get 
  { 
    DataSet ds = new DataSet("MyDataSet"); 

    // everything hard-coded for this example 
    int to = 12;
    int ps = 2048;
    string sv = "10";
    string st = "Open";
    string wsid = "ZAMBONI";

    DataTable dt = new DataTable("MyDataTable");
    DataColumn propertyName = new DataColumn("Property");
    DataColumn propertyValue = new DataColumn("Value");
    dt.Columns.Add(propertyName);
    dt.Columns.Add(propertyValue);
    dt.Rows.Add("Connection timeout", to);
    dt.Rows.Add("Packet size", ps);
    dt.Rows.Add("Server version", sv);
    dt.Rows.Add("State", st);
    dt.Rows.Add("Worksation id", wsid);
    ds.Tables.Add(dt);

    return ds.Tables[0].DefaultView; 
  } 
} 
2 голосов
/ 14 мая 2013

Вы можете сделать это путем реализации интерфейса ITypedList в вашей коллекции ItemsSource.

DataGrid будет использовать PropertyDescriptor s, возвращенный из ITypedList.GetItemProperties , для автоматической генерации DataGridColumn s без каких-либо дополнительных XAMLвнутренне используя DataGrid.GenerateColumns метод.

0 голосов
/ 25 августа 2010

конечно можно.

Я не думал об этом более 5 секунд, но вот как вы можете это сделать: 1. Определите прикрепленное свойство к сетке данных, чтобы при значении true вы регистрировались в событии с загруженной сеткой, при возникновении события вы извлекаете его контекст из параметра отправителя, а затем отправляете его в метод, который его заполнит с колоннами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...