gpt4 book ai didi

c# - 在 C# 中将 DataGridComboBoxColumn 绑定(bind)到 DataGrid 的 ItemsSource

转载 作者:太空狗 更新时间:2023-10-29 23:51:23 28 4
gpt4 key购买 nike

我正在以编程方式创建 DataGrid 并且也必须支持 ComboBoxColumns

创建 DataGrid 后,我将其 ItemSource 设置为 BindableList<BindableDictionary> 类型集合的集合。 BindableDictionary 是自定义类型。每个 BindableDictionary 代表一个元组。它的键始终是列的名称,它的值是一个自定义类,该类包含一个名为 ActualValue 的通用属性、一个名为 Dictionary<T, string>AllowedValues 和一个确定 boolean 是否将用于构建 AllowedValues 或“普通”列的 ComboBoxColumn 。该类还实现了 INotifyPropertyChangedINotifyPropertyChanging

除了 ComboBoxColumn 之外,这些东西都有效,呃。 ComboBoxColumn 的问题是我不知道如何让它使用 AllowedValues 对象来填充它的 ItemList 使用 ActualValue 属性从 Value AllowedValues 中选择正确的 BindableDictionary 来填充文本区域.

例如,这是我绑定(bind)基于文本的列的方式:

table.Columns.Add(new DataGridTextColumn() { Header = column.GUIName, DisplayIndex = column.Position, Binding = new Binding(column.Name + ".ActualValue") { UpdateSourceTrigger = UpdateSourceTrigger.Default, Mode = BindingMode.TwoWay, NotifyOnTargetUpdated = true, NotifyOnSourceUpdated = true, UpdateSourceExceptionFilter = new UpdateSourceExceptionFilterCallback(BindingExceptionHandler) } });

是的,这行得通。

我尝试将 ItemsSourceDataGridComboBoxColumn 属性设置为 column.AllowedValues,并将 DisplayPath 设置为 "Value",这至少会显示正确的内容,但我不知道如何绑定(bind)到 ActualValue 中包含的 DataGrid 属性 ' ItemsSource 。这也意味着列中的所有单元格共享相同的可选值,这可能会在未来导致问题。

如果我尝试像在 DataGridTextColumn 中那样绑定(bind)所有内容,则根本不会显示任何内容。也没有可供选择的项目。

如果有人能告诉我可以尝试的东西,那就太棒了。

编辑

刚看到这个:https://stackoverflow.com/a/2197004/937093,我试过了,但我在输出窗口中收到以下消息:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=AllowedValues; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=33493530); target property is 'ItemsSource' (type 'IEnumerable')

我的代码是这样的:

col = new DataGridComboBoxColumn() { Header = column.GUIName, SelectedValueBinding = new Binding(column.Name + ".ActualValue"), SelectedValuePath = "ActualValue" };
table.Columns.Add(col);
BindingOperations.SetBinding(col, DataGridComboBoxColumn.ItemsSourceProperty, new Binding("AllowedValues"));

编辑2好的,找到了这个网站:http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

我尝试应用代理绑定(bind)的东西(即使我不明白 Column 为什么不是 DataGrid 的可视化树的一部分...它还会在哪里?!)但它不会工作。我的代码:

BindingProxy proxy = new BindingProxy() { Data = table.ItemsSource };
table.Resources.Add("proxy", proxy });
col = new DataGridComboBoxColumn() { Header = column.GUIName, SelectedValueBinding = new Binding("Data." + column.Name + ".ActualValue") { Source = proxy }, DisplayMemberPath = "Value", SelectedValuePath = "Key" };
table.Columns.Add(col);
BindingOperations.SetBinding(col, DataGridComboBoxColumn.ItemsSourceProperty, new Binding("Data." + column.Name + ".AllowedValues") });

在输出窗口中输出:

System.Windows.Data Error: 40 : BindingExpression path error: 'MyColumn' property not found on 'object' ''BindingList`1' (HashCode=55207835)'. BindingExpression:Path=Data.MyColumn.ActualValue; DataItem='BindingProxy' (HashCode=45660050); target element is 'TextBlockComboBox' (Name=''); target property is 'SelectedValue' (type 'Object')

我理解这个问题(它试图在 BindingList 中找到“MyColumn”对象)但我不明白为什么会这样(它应该解析为 BindingList[iterator]["MyColumn"],因为 BindingList 包含BindableDictionary,这正是我的“普通”列所发生的情况。

最佳答案

我做了类似的事情。我使用的是 Winforms,所以我的解决方案可能不适合你。但是我建议使用与此类似的东西。

http://tech.pro/tutorial/776/csharp-tutorial-binding-a-datagridview-to-a-collection

再加上这个。

http://www.codeproject.com/Articles/31418/Implementing-a-Sortable-BindingList-Very-Very-Quic

当我一切正常时,我发现我无法对我的 datagridview 进行排序。

我手边没有源代码,但总体思路是我手动创建组合框和文本框列,然后将我的列表绑定(bind)到它。

在我运行一个基于索引遍历每一行的函数之后(在我的例子中,我的组合框是最后 3 列)我将首先手动添加组合框的值,然后再添加这些值添加后,我会检查组合框的值并将其设置为该值。

我还在数据错误事件中包含了这个函数,当我添加一个新列时。如果我添加一个新行,如果我设置了自动调整大小,它也会随机崩溃。我必须将这些设置为默认值,进行编辑,然后重新设置。

希望我能提供代码,但它可能会让您走上正轨。如果我明天上类时没有,我会发布一些。使用组合框非常麻烦。

关于c# - 在 C# 中将 DataGridComboBoxColumn 绑定(bind)到 DataGrid 的 ItemsSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20237869/

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