我正在以编程方式创建DataGrid
,并且还必须支持ComboBoxColumns
。
创建DataGrid
后,我将ItemSource
设置为BindableList<BindableDictionary>
类型集合的集合。 BindableDictionary
是自定义类型。每个BindableDictionary
代表一个元组。它的关键是始终是列的名称,它的值是一个自定义类,其中包含一个名为ActualValue
的通用属性,一个名为Dictionary<T, string>
的{{1}}和一个AllowedValues
,用于确定是否boolean
将用于构建AllowedValues
或“普通”列。该类还实现了ComboBoxColumn
和INotifyPropertyChanged
。
除了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,这正是我的“普通”列所发生的事情。)
答案 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列)我首先手动添加组合框的值,然后在那些之后添加,我会检查组合框的值并将其设置为。
我还在数据错误事件中包含了此函数,因为我添加了一个新列。如果我添加了一个新行,如果我有自动调整集,它也会随机崩溃。我必须将它们设置为默认值,进行编辑,然后重置它。
希望我提供代码,但它可能会让你继续前进。如果不是我明天上班的话,我会发一些。组合框是一种巨大的痛苦。