在WPF DataGrid中动态生成列?

时间:2010-08-25 10:20:35

标签: wpf datagrid

<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
  </DataGrid.Columns>
</DataGrid>

在上面的代码片段中,DataGrid列在XAML中进行了硬编码。

是否可以在其他地方定义列定义,理想情况是在MVVM视图模型中定义,以便可以动态定义和重新定义列?

3 个答案:

答案 0 :(得分:3)

以下列方式使用带有MVVM模式的Microsoft DataGrid对我有用,因为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; 
  } 
} 

答案 1 :(得分:2)

您可以通过ItemsSource集合实现ITypedList接口来实现。

DataGrid将使用PropertyDescriptor方法返回的ITypedList.GetItemProperties在内部使用DataGridColumn方法自动生成DataGrid.GenerateColumns而无需任何其他XAML。

答案 2 :(得分:0)

当然有可能。

我没有考虑超过5秒,但这是你如何做到这一点: 1.为数据网格定义一个附加属性,当设置为true时,你将注册到网格加载事件,当事件触发时,你将从sender参数中提取他的上下文,而不是将他发送到一个方法来填充他与列。