gpt4 book ai didi

wpf - 如何在 WPF DataGrid 中实现多列 ComboBox DataGridColumn?

转载 作者:行者123 更新时间:2023-12-04 20:19:25 25 4
gpt4 key购买 nike

我有一个简单的问题,我认为没有简单的解决方案。我的 WPF DataGrid 中的一些网格列需要一个多列 ComboBox。是否有已知的最佳实践来实现这一目标?根据我收集到的信息,这将需要对 DataGridComboBoxColumn 进行子类化以支持自定义 ComboBox。

我找到了一些不支持 EF 实体的示例(我使用的是 Code First EF)。

非常感谢任何建议。谢谢

注意:这一切都是用 C# 动态完成的。我没有使用 XAML 来定义列。

更新:我所说的多列的意思很简单,当您放下 ComboBox 时,我需要为“显示”显示两个值,尽管当然在幕后我仍然只是存储一个身份证。

看这里:。 multicolumn-dropdown http://www.telerik.com/ClientsFiles/188010_multicolumn-dropdown.JPG

除了我需要将其作为可以动态创建并添加到网格的 DataGridColumn 来执行此操作,而不仅仅是图像中显示的简单组合。

更新 我终于设法在 CodeProject 上找到一篇文章,作者在其中开发了符合我的 - 确切 - 要求的控件。它位于 here .现在我试图解决的唯一问题是如何在使用 Entity Framework 时允许控件工作(具体来说,代码优先)。越来越近了!

最佳答案

我已经为我的特定场景找到了解决方案。我从上面上次更新的链接下载了自定义多列 ComboBox,其中包含 DataGridComboBoxColumn 子类。基本上,我只是使用 Entity Framework Code-First POCO 完成了这项工作,它解决了我的问题。这是我必须做的才能让它与 POCO 一起工作。

在 CustDataGridComboBoxColumn 内部有一些覆盖。您只需要稍微修改以下两个覆盖。我正在使用反射来更改设置属性,因为我不知道它将来自控件的内容。

最初的实现是通过使用 SelectedValuePath 从 DataRowView 中获取正确的行来实现的。

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 中动态创建此自定义控件,则必须向 Columns 属性添加一个 setter ,因为默认情况下它被设置为只读。

//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;
}
}

感谢您提供的意见和答复。抱歉,一开始我无法充分表达这个问题以使其更有意义。

关于wpf - 如何在 WPF DataGrid 中实现多列 ComboBox DataGridColumn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7168305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com