我正在尝试使用自动生成列创建数据网格。
假设我的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):
但现在我的问题是:我想将显示的数据绑定到我的ArticleConfigurationSet
属性。但是我无法更改我的ItemsSource Binding,因为datagrid的SelectedItem属性必须是ArticleWrapper
(用于命令处理)。
datagrid也应如下所示:
你有什么想法怎么做?
答案 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.Key
和ArticleConfigurationSet.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
}