- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在以编程方式创建 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
来填充文本区域.
例如,这是我绑定(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) } });
是的,这行得通。
我尝试将 ItemsSource
的 DataGridComboBoxColumn
属性设置为 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/
我在 ListView 上使用 ItemsSource。我现在想使用 SQL 查询执行搜索和过滤项目,因此我重新分配了 ItemsSource;但随后抛出异常: 在使用 ItemsSource 之前,
我有一段代码不能正常工作。如果我执行一次 btnNew 就没有问题。如果我执行两次,我会得到一个错误... Operation is not valid while ItemsSource is in
我是 Binding 和 WPF 的新手,最近我学会了如何使用 Binding 技术创建一个包含多个列的 listBox
我的模型中有以下内容: public class Equipment { public enum Type { Detector, Vegetation
我已经创建了自己的集合并实现了 INotifyCollectionChanged。 public class ObservableSortedSet : SortedSet, INotifyColle
我有一个包含项目数组的 View 模型: public class FooViewModel { public FooListItem[] ListItems { get; set; }
如果 DataContext 更改 TabControl 没有反应 现在我必须在这里做每一个变化 tabControlRoom.ItemsSource = (IEnumerable)new Res
如何将枚举设置为 xaml 中的列表框。但是在列表框中,我需要显示描述而不是枚举的名称/值。然后,当我单击一个按钮时,我需要将选定的枚举通过 icommand 作为枚举而不是字符串传递给方法。 例如:
将组合框的 ItemsSource 设置为整数数组? 最佳答案 0 1 2
我的 TreeView 绑定(bind)到 ObservableCollection 并使用 HierarchicalDataTemplates。 我从网络服务中获取模型。 只有当用户单击树中的节点时
我的 WPF 应用程序中有一个 Datagrid 控件,我正在尝试将该控件绑定(bind)到我的主窗口类中的 ObservableCollection 属性。我试图绑定(bind)的属性定义为: pr
我正在写一个自定义 ItemsControl (一个选项卡式文档容器),其中每个项目(选项卡)都可以在用户关闭它时从 UI 中移除。但是,我不能直接从 ItemsControl.Items 中删除它。
这是一些 XAML data:FolderEntity 是一个 LINQ to SQL 数据类,它实现了 INotifyPropertyChanging 和 INotifyProperty
我有一个 Xamarin.Forms(3.2,最新版本)Picker实现为 BindingContext 是这个 ViewModel: public class ClassroomsViewMod
好吧,我正在设计一个自定义 WPF 控件——为了学习——它以类似于 Visual Studio 的方式显示日志消息。我想允许用户通过将消息实例添加到 Items 来添加消息集合,或通过绑定(bind)
我已经阅读了一些帖子,但没有人帮助我解决我的问题。 所以,我有一个带有 Viewmodel 的 View ,并且在 View 内部有一个 DataGrid 绑定(bind)到 viewmodel 内的
我有一个带有 ItemsSource 属性的 UserControl。由于基本的 UserControl 类没有实现 ItemsSource,我必须像这样创建自己的依赖属性: #region Item
在 WPF 中,您可以使用 IValueConverter 或 IMultiValueConverter 将数据绑定(bind)值从 int到 Color. 我有一个模型对象的集合,我想将它们转换为它
我有按钮“添加”和“删除”,但“删除”不起作用。怎么了? 算上我的ObservableCollection已更改,但 ListBox 未更改 示例项目:https://github.com/Vesel
我有一个 UniformGrid .在里面,我想放一个Grid其中包含 2 个 child - 和 Image和 Canvas .我已经有一个 List包含 Grid 的成员有了这个定义。 我正在更新
我是一名优秀的程序员,十分优秀!