【问题标题】:Datagrid: generate columns from a property of the ItemsSource collectionDatagrid:从 ItemsSource 集合的属性生成列
【发布时间】:2012-01-01 04:27:06
【问题描述】:

我正在尝试创建具有自动生成列的数据网格。 假设我的 Collection 是一个名为 Articles 的属性,属于我的 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):

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

数据网格也应如下所示:

你有什么想法吗?

【问题讨论】:

  • 我将使用 linq 生成一个对视图更友好的视图模型,并以旧方式进行。但感谢所有答案。

标签: c# wpf vb.net datagrid wpftoolkit


【解决方案1】:

设置 AutoGenrateColumns = false 并使用具有 LableItemTemplate 并将其绑定到您想要的字段或属性。

【讨论】:

  • 可以,但我想自动生成所有列,所以如果有新属性我不需要更改视图。
【解决方案2】:

为什么不设置 AutoGenrateColumns = false 并根据您的 ArticleConfigurationSet 属性动态创建网格列和绑定?

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

编辑:我的意思是您可以遍历您的 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
 }

【讨论】:

  • 这不是我的问题。显示的列应该从我的对象自动生成。而且我不想通过 xaml 修复这个问题,因为在进一步的版本中,对象可以(并且将会)改变。
  • 这就是您想要自动生成网格的对象不是您绑定到的对象的问题。所以你必须自己做一些事情。
【解决方案3】:

您可以同时拥有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

【讨论】:

  • 他只想要 ArticleConfigurationSet 的列而不需要其他列 - 或者?
  • @blindmeis 听起来他正在寻找一种自动生成所有列的方法,除了ArticleConfigurationSet 列,他希望将其显示为两个特定列,分别显示Key 和@987654328 @。这个解决方案就是这样做的。
猜你喜欢
  • 2015-05-24
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2014-10-05
  • 2011-10-25
  • 1970-01-01
相关资源
最近更新 更多