Ste*_*ler 5 .net c# wpf datagrid wpfdatagrid
我正在以DataGrid编程方式创建并且也必须支持ComboBoxColumns.
在我创建之后DataGrid,我将它设置ItemSource为一个类型集合的集合BindableList<BindableDictionary>.BindableDictionary是一种自定义类型.每个BindableDictionary代表一个元组.它的关键是始终是列的名称,它的值是一个自定义类,它包含一个名为ActualValue,Dictionary<T, string>被调用的通用属性,AllowedValues以及一个boolean确定是否AllowedValues将用于构建一个ComboBoxColumn或"普通"列的自定义属性.该类实现INotifyPropertyChanged和INotifyPropertyChanging.
除了ComboBoxColumn之外,那些东西还可以.我对ComboBoxColumn的问题在于我不知道如何让它使用该AllowedValues对象来填充它的ItemList 并使用该ActualValue属性Value从AllowedValues BindableDictionary填充textarea中选择正确的.
例如,这是我绑定基于文本的列的方式:
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) } });
Run Code Online (Sandbox Code Playgroud)
是的,这很有效.
我试图设置ItemsSource的属性DataGridComboBoxColumn来column.AllowedValues并设置DisplayPath于"Value"其中并至少显示正确的内容,但我不知道如何绑定到ActualValue包含在物业DataGrid的ItemsSource.这也意味着列内的所有单元共享相同的可选值,这可能导致将来出现问题.
如果我尝试像我一样绑定所有内容DataGridTextColumn,则根本不会显示任何内容.此外,没有可供选择的项目.
如果某人有一点点可以尝试的东西,那就太棒了.
编辑
刚看到这个:https://stackoverflow.com/a/2197004/937093,我试过了,但后来我在输出窗口中收到以下消息:
System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement.BindingExpression:路径= ALLOWEDVALUES; 的DataItem = NULL; target元素是'DataGridComboBoxColumn'(HashCode = 33493530); target属性是'ItemsSource'(输入'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"));
Run Code Online (Sandbox Code Playgroud)
编辑2 好的,发现这个网站:http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/
我试图应用代理绑定的东西(即使我不知道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") });
Run Code Online (Sandbox Code Playgroud)
输出窗口中的输出:
System.Windows.Data错误:40:BindingExpression路径错误:在'object'''BindingList`1'(HashCode = 55207835)'上找不到'MyColumn'属性.BindingExpression:路径= Data.MyColumn.ActualValue; DataItem ='BindingProxy'(HashCode = 45660050); target元素是'TextBlockComboBox'(Name =''); target属性是'SelectedValue'(类型'Object')
我理解这个问题(它试图在BindingList中找到'MyColumn'对象),但我不明白为什么会这样(它应该解析为BindingList [iterator] ["MyColumn"],因为BindingList包含BindableDictionary,那是究竟是什么发生在我的"正常"栏目中.
小智 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 列),我首先手动添加组合框的值,然后在添加这些值之后,我会检查组合框的值并将其设置为该值。
当我添加新列时,我还在数据错误事件中包含了此函数。如果我添加一个新行,如果我设置了自动调整大小,它也会随机崩溃。我必须将它们设置为默认值,进行编辑,然后重置它。
希望我能提供代码,但这可能会让你陷入困境。如果没有,明天上班时我会发布一些。使用组合框是一件非常痛苦的事情。
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |