Datagrid:从ItemsSource集合的属性生成列

时间:2011-11-18 11:44:55

标签: c# wpf vb.net datagrid wpftoolkit

我正在尝试使用自动生成列创建数据网格。 假设我的Collection是我的Articles类型的viewmodel名为ObservableCollection<ArticleWrapper>的属性。

我现在将ItemsSource绑定到此集合:

<wpf:DataGrid ItemsSource={Binding Articles} />

班级ArticleWrapper是这样的:

[c#]
public class ArticleWrapper
{
    public ArticleConfigurationSet ArticleConfigurationSet { get; set; }
    public string Description { get; set; }
}


[vb.net]
Public Class ArticleWrapper
    Public Property ArticleConfigurationSet As ArticleConfigurationSet
    Public Property Description As String
End Class

班级ArticleConfigurationSet是这样的:

[c#]
public class ArticleConfigurationSet
{
    public string Key { get; set; }
    public int Number { get; set; }
}

[vb.net]
Public Class ArticleConfigurationSet
    Public Property Key As String
    Public Property Number As Integer
End Class

自动生成的列看起来像这样(请忘记CustomEntries): enter image description here

但现在我的问题是:我想将显示的数据绑定到我的ArticleConfigurationSet属性。但是我无法更改我的ItemsSource Binding,因为datagrid的SelectedItem属性必须是ArticleWrapper(用于命令处理)。

datagrid也应如下所示: enter image description here

你有什么想法怎么做?

3 个答案:

答案 0 :(得分:2)

您可以同时拥有AutoGenerateColumns="True",并定义自己的自定义列

例如,

<DataGrid ItemsSource="{Binding Articles}" 
          AutoGenerateColumns="True"
          AutoGeneratingColumn="DataGrid_AutoGeneratingColumn">
    <DataGrid.Columns>
        <DataGridColumn Binding="{Binding ArticleConfigurationSet.Key}" Header="Key" />
        <DataGridColumn Binding="{Binding ArticleConfigurationSet.Value}" Header="Value" />
    </DataGrid.Columns>
</DataGrid>

// If we are auto-generating the ArticleConfigurationSet column, 
// cancel it so that column doesn't get rendered
void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if(e.ColumnName == "ArticleConfigurationSet")
        e.Cancel = true;
}

如果您想要重新排列列顺序,则可能需要执行一些代码隐藏,但是这应该会自动生成对象中除ArticleConfigurationSet列之外的所有内容的列,并且还会添加另外两列适用于ArticleConfigurationSet.KeyArticleConfigurationSet.Value

答案 1 :(得分:1)

设置 AutoGenerateColumns = false 并使用带有标签 ItemTemplate ,并将其绑定到您想要的字段或属性。

答案 2 :(得分:1)

为什么不设置AutoGenrateColumns = false并根据ArticleConfigurationSet属性创建gridcolumns和bindings动态?

你不必改变视图,你可以做你想做的事。

编辑:我的意思是你可以遍历你的ArticleConfigurationSet属性(例如使用反射)并创建Gridcolumns和绑定。

 foreach(var p in properties)
 {
      //grid add new gridcolumn
      //set binding to ArticleConfigurationSet Property Name
      var b = new Binding("ArticleConfigurationSet"+p.Name);
      //add binding to gridcolumn
 }