2011-11-18 49 views
0

我试图用自动生成列创建一个数据网格。 假设我的收藏是我的ObservableCollection<ArticleWrapper>类型的视图模型Articles的属性。Datagrid:从ItemsSource集合的一个属性生成列

我现在绑定的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绑定,因为数据网格的SelectedItem属性必须为ArticleWrapper(用于命令处理)。

数据网格也应该是这样的: enter image description here

你有什么想法如何做到这一点?

+0

我会用linq生成一个更友好的视图模型,并在旧的方式做...但感谢所有的答案。 –

回答

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 
} 
+0

这不是我的问题。显示的列应该从我的对象自动生成。而且我不想这样做由xaml修复,因为在更高版本中对象可以(并且将会)改变。 –

+0

多数民众赞成多数民众赞成在你想要自动生成网格的对象不是你绑定的对象。所以你必须自己做一些事情。 – blindmeis

1

设置AutoGenrateColumns =假和使用的ItemTemplate拉布勒并将其绑定到你想要的字段或属性。

+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

添加两个其他列
+0

他只需要ArticleConfigurationSet的列,而不需要其他 - 或? – blindmeis

+0

@blindmeis这听起来像他正在寻找一种方法来自动生成所有的列,除了'ArticleConfigurationSet'列,他希望显示为两个特定的列显示'Key'和'Value'。这个解决方案做到了。 – Rachel

相关问题