我有一个简单的问题,我认为没有一个简单的解决方案。我需要为我的WPF DataGrid中的某些网格列提供一个多列ComboBox。有没有一个已知的最佳实践来实现这一目标?根据我的收集,这将需要继承DataGridComboBoxColumn以支持自定义ComboBox。
我找到了一些这方面的例子但不支持EF实体(我正在使用Code First EF)。
非常感谢任何建议。感谢
注意:这都是使用C#动态完成的。我没有使用XAML来定义列。
更新:我对多列的意思很简单,当你放下ComboBox时我需要为“显示”显示两个值,即使幕后当然我还在存储一个ID。
见这里: http://www.telerik.com/ClientsFiles/188010_multicolumn-dropdown.JPG
除了我需要将其作为可以动态创建并添加到网格的DataGridColumn,而不仅仅是图像中显示的简单组合。
更新我终于找到了一篇关于CodeProject的文章,其中作者使用我的-exact-要求开发了一个控件。它位于here。现在,我试图解决的唯一问题是如何在使用Entity Framework(特别是代码优先)时允许控件工作。越来越近了!
答案 0 :(得分:3)
我找到了适合我特定场景的解决方案。我从上一次更新中的链接下载了包含DataGridComboBoxColumn子类的自定义多列ComboBox。基本上我只是使用Entity Framework Code-First POCO进行了这项工作,它解决了我的问题。以下是我必须做的事情才能使其与POCO一起使用。
CustDataGridComboBoxColumn内部有一些覆盖。您只需稍微修改以下两个覆盖。我正在使用反射来更改设置属性,因为我不知道它将来自控件。
最初的实现是通过DataRowView和SelectedValuePath获取正确的Row来实现的。
protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
{
DataGridCell cell = editingEventArgs.Source as DataGridCell;
if (cell != null)
{
// Changed to support EF POCOs
PropertyInfo info = editingElement.DataContext.GetType().GetProperty("YourPropertyName", BindingFlags.Public | BindingFlags.Instance);
object obj = info.GetValue(editingElement.DataContext, null);
comboBox.SelectedValue = obj;
}
return comboBox.SelectedItem;
}
protected override bool CommitCellEdit(FrameworkElement editingElement)
{
// Dynamically set the item on our POCO (the DataContext).
PropertyInfo info = editingElement.DataContext.GetType().GetProperty(“YourPropertyName”, BindingFlags.Public | BindingFlags.Instance);
info.SetValue(editingElement.DataContext, comboBox.SelectedValue, null);
return true;
}
此外,如果您打算在代码中完全在代码中创建此自定义控件而不是在XAML中,则必须将一个setter添加到Columns属性,因为默认情况下它设置为只读。
//The property is default and Content property for CustComboBox
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ObservableCollection<DataGridTextColumn> Columns
{
get
{
if (this.columns == null)
{
this.columns = new ObservableCollection<DataGridTextColumn>();
}
return this.columns;
}
set
{
this.columns = value;
}
}
感谢您提供的意见和答案。抱歉,我最初无法充分说出问题,以便更有意义。
答案 1 :(得分:0)
你能说清楚你的意思吗?
您是否希望拥有以下任何一种产品?
[Column] (Combo) (Combo) (Combo) [Column]
or
[Column]
(Combo)
(Combo)
(Combo)
[Column]
如果是这样,您将需要使用DataGridTemplateColumn类型为列实现单元格模板。
http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-datagrid-feature-walkthrough.aspx
您可以在XAML中进行设置,然后只为网格提供一个集合,以便根据需要呈现列。
答案 2 :(得分:0)
“YourPropertyName”的含义是: PropertyInfo info = editingElement.DataContext.GetType()。GetProperty(“YourPropertyName”,BindingFlags.Public | BindingFlags.Instance);