将DataGridComboBoxColumn绑定到C#中的DataGrid的ItemsSource

时间:2013-11-27 09:02:13

标签: c# .net wpf datagrid wpfdatagrid

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

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

除了ComboBoxColumn之外,那些东西还可以。我的ComboBoxColumn的问题是我不知道如何让它使用INotifyPropertyChanging对象填充它的ItemList 使用AllowedValues属性来选择正确的{来自ActualValue Value的{​​1}}来填充textarea。

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

AllowedValues

是的,这很有效。

我尝试将BindableDictionary的{​​{1}}属性设置为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) } }); ,并将ItemsSource设置为DataGridComboBoxColumn,这至少会显示正确的内容,但我不知道如何绑定column.AllowedValues的{​​{1}}中包含的DisplayPath属性。此外,这意味着列中的所有单元格共享相同的可选值,这可能会导致将来出现问题。

如果我尝试像"Value"中那样绑定所有内容,则根本不会显示任何内容。此外,没有可供选择的项目。

如果某人有一点点可以尝试的东西,那就太棒了。

修改

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

  

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径= ALLOWEDVALUES;的DataItem = NULL; target元素是'DataGridComboBoxColumn'(HashCode = 33493530); target属性是'ItemsSource'(类型'IEnumerable')

我的代码如下所示:

ActualValue

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

我尝试应用代理绑定的东西(尽管我不知道Column是如何不是 DataGrid的可视化树的一部分......它还会在哪里?!)但它不会起作用。我的代码:

DataGrid

输出窗口中的输出:

  

System.Windows.Data错误:40:BindingExpression路径错误:'MyColumn'   在'object'''BindingList`1'(HashCode = 55207835)'上找不到属性。   BindingExpression:路径= Data.MyColumn.ActualValue;   DataItem ='BindingProxy'(HashCode = 45660050);目标元素是   'TextBlockComboBox'(Name =''); target属性是'SelectedValue'   (输入'对象')

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

1 个答案:

答案 0 :(得分:0)

我做了类似的事情。我使用的是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进行排序。

我没有方便的源代码,但一般的想法是我手动创建我的组合框和文本框列,然后将我的列表绑定到它。

在我运行一个迭代每一行并基于索引的函数之后(在我的情况下,我的组合框是最后3列)我首先手动添加组合框的值,然后在那些之后添加,我会检查组合框的值并将其设置为。

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

希望我提供代码,但它可能会让你继续前进。如果不是我明天上班的话,我会发一些。组合框是一种巨大的痛苦。