问题标签 [icustomtypedescriptor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1485 浏览

c# - 一个数据源需要多个 BindingSource 组件?

根据我之前的问题,通过 .NET 中的某种接口使属性可用于数据绑定?,我在@Marc Gravell的帮助下进行了管理,通过实现接口ICustomTypeDescriptor我可以为表单设计器提供自定义属性,这些属性可能会或可能不会作为真正的普通属性在相关组件上实际可见。

我做到了这一点,但我的实施存在缺陷。我现在遇到的最大问题是,如果我在我的表单上拖放一个组件,它有两个这样的自定义属性,然后将两个文本框拖放到表单上,并使用数据绑定,属性检查器中的数据绑定下拉菜单需要一个对象数据源,但我绑定到控件的每个属性都会在表单上添加另一个BindingSource组件。

让我重新表述一下。我将自定义组件放到表单上。它有两个属性,可通过我的ICustomTypeDescriptor实现获得,但作为普通属性不可见。

然后我将两个文本框放到表单上。我去属性检查器让其中一个为 Text 属性添加数据绑定,它需要项目中的对象数据源,我添加了它。然后,在将文本框上的 Text 属性绑定到我的自定义组件的第一个属性之后,表单设计器添加了另一个组件,即“customDataBindingBindingSource”,用于桥接两者之间的数据绑定。到目前为止,一切都很好。

然后,当我以相同的方式为该其他文本框设置数据绑定时(除了我现在可以选择自定义组件的其他属性),添加了另一个这样的桥,“customDataBindingBindingSource1”。如果我不断切换要绑定的属性,则每次都会添加一个这样的桥。

这真的有必要吗?

如果不是,我在ICustomTypeDescriptor实现中做错了什么?诚然,这很天真、简单而且远未完成,但我不知道我需要解决什么问题。任何指针?

这是我的自定义类:

此外,我需要在表单构造函数中手动将这些桥连接到我最初删除的组件,如下所示:

有没有办法解决很多问题?

基本上,在使用我的组件时我想做的是:

  1. 将我的自定义组件之一拖放到表单上
  2. 删除必要的控件(文本框、日期选择器等)
  3. 将控件的数据绑定分配给我的自定义组件上的相关属性

如果可能的话,我想避免项目数据源、桥接组件以及构造函数中的代码。我想避免的一切。

请注意,我不要求任何人给我代码。欢迎任何指点。

0 投票
1 回答
5054 浏览

c# - DataGridView 未显示实现 ICustomTypeDescriptor 的对象的属性

我在DataGridView中显示对象列表。一切正常。列会根据对象的属性自动添加到DataGridView 。

现在我更改了在网格中显示的类以实现ICustomTypeDescriptor但是现在,当我将它的DataSource设置为我的自定义对象列表时,网格现在不再显示任何列或行。

我猜这与使用ICustomTypeDescriptor的事实有关,每个网格的每一行中显示的每个实例都可能返回一组不同的属性。

我正在实现ICustomTypeDescriptor,以便我可以允许用户在运行时向对象动态添加自定义属性。这些自定义属性应该通过DataGridView可见和可编辑。

为什么DataGridView看不到我的ICustomTypeDescriptor方法?是否有另一种方法可以动态地将属性添加到将显示在DataGridView中的对象?

0 投票
3 回答
2435 浏览

wcf - 从代码动态创建 WCF DataContract

鉴于我有一个完全动态的对象模型,也就是说,我没有在代码中的任何地方定义具体类,但我仍然希望能够为它们创建 WCF DataContracts,以便我可以在操作中使用它们。我怎样才能做到这一点?

我的具体类“实体”实现了 ICustomTypeDescriptor,它用于向外界呈现各种属性,但我对 WCF 的实验表明 WCF 并不关心 ICustomTypeDescriptor。这是正确的还是我错过了什么?

这可能吗?不可能,创建 DataContract 的唯一方法是实际拥有一个具体的硬编码类,可以吗?

0 投票
5 回答
8776 浏览

c# - 只读 PropertyGrid

我正在编写的应用程序中使用 PropertyGrid,以允许用户查看和有时编辑我的对象的实例。有时用户可能会以读/写模式打开文件,他们可以通过属性网格对文件进行更改。在其他情况下,他们可能会以只读模式打开文件,并且不应通过 PropetyGrid 对对象进行任何更改。我的类还具有通过实现 ICustomTypeDescriptor 返回的动态属性。这就是为什么我真的想利用 PropertyGrid 控件的内置灵活性。

似乎没有一种简单的方法可以将 Property-grid 设置为只读模式。如果我禁用 PropertyGrid,这也会阻止用户滚动列表。所以我认为最好的方法是在运行时将 ReadOnlyAttributes 添加到属性中。还有其他方法吗?

0 投票
1 回答
4441 浏览

c# - 将 ICustomTypeDescriptor.GetProperties 返回的属性动态更改为只读

我有一个实现 ICustomTypeDescriptor 的类,并由用户在 PropertyGrid 中查看和编辑。我的班级还有一个 IsReadOnly 属性,该属性确定用户以后是否能够保存他们的更改。如果用户无法保存,我不想让他们进行更改。因此,如果 IsReadOnly 为真,我想覆盖任何在属性网格中可编辑为只读的属性。

我正在尝试使用 ICustomTypeDescriptor 的 GetProperties 方法将 ReadOnlyAttribute 添加到每个 PropertyDescriptor。但这似乎不起作用。这是我的代码。

这甚至是使用 TypeDescriptor.AddAttributes() 的正确方法吗?在调用后进行调试时,AddAttributes() 属性仍然具有相同数量的属性,其中没有一个是 ReadOnlyAttribute。

0 投票
4 回答
716 浏览

c# - 如何解决这个 lambda 表达式外部变量问题?

我正在使用 PropertyDescriptor 和 ICustomTypeDescriptor(仍然)尝试将 WPF DataGrid 绑定到一个对象,该对象的数据存储在字典中。

因为如果您向 WPF DataGrid 传递一个 Dictionary 对象列表,它将根据字典的公共属性(Comparer、Count、Keys 和 Values)自动生成列,因此我的 Person 是 Dictionary 的子类并实现 ICustomTypeDescriptor。

ICustomTypeDescriptor 定义了一个返回 PropertyDescriptorCollection 的 GetProperties 方法。

PropertyDescriptor 是抽象的,因此您必须对其进行子类化,我想我应该有一个构造函数,它采用 Func 和一个 Action 参数来委托获取和设置字典中的值。

然后我为字典中的每个键创建一个 PersonPropertyDescriptor,如下所示:

问题是每个属性都有自己的 Func 和 Action 但它们都共享外部变量s所以尽管 DataGrid 为“ID”、“FirstName”、“LastName”、“Age”、“Gender”自动生成列,但它们都得到并且针对“性别”设置,这是foreach 循环中s的最终静止值。

如何确保每个委托都使用所需的字典键,即实例化 Func/Action 时 s 的值?

非常感谢。


这是我剩下的想法,我只是在这里试验这些不是“真正的”课程......

0 投票
2 回答
2407 浏览

c# - 通过 ICustomTypeDescriptor 生成 WPF DataGrid AutoColumn

在一个测试项目中,我设法在以下场景中自动生成 WPF DataGrid 列,其中数据存储在字典中并通过 PropertyDescriptors 执行绑定:

我遇到的问题是在我的现实生活项目中,我正在使用 MVVM,所以它是继承 ViewModelBase 的People ViewModel,因此不能继承 List<Person>。我尝试使用内部 List<Person> 实现 IList<Person> 并将 DataContext 显式设置为 IList<Person> 引用,但这不起作用。

我在这里看到了关于绑定 win 表单 DataGridView 的类似帖子,所以我想知道 WPF 中是否适用相同类型的逻辑,主要是什么导致 ICustomTypeDescriptor 实现在继承 List<T> 时被拾取,即当您简单地实现 IList<T> 时丢失。

0 投票
1 回答
934 浏览

vb.net - VB.NET 动态自定义类型描述符

我正在玩弄一个想法(以前从未使用过 TypeDescriptors),并设法让它很好地工作。但我担心我在小实验中做出的一些“最佳实践”决定。

我使用一个 CustomTypeDescriptor,它从其 PropertyDescriptor 接收一个事件,指示值正在更改或被查询。

每次调用 GetTypeDescriptor 时,TypeDescriptorProvider 都会生成一个全新的 CustomTypeDescriptor 实例,然后它将 CustomTypeDescriptor 上的事件绑定到实例对象。

我不确定每次调用 GetTypeDescriptor 时是否生成一个新的 CustomTypeDescriptor 是否是一个好主意(即使我不得不这样做)。我也不确定直接从 CustomTypeDescriptor 绑定事件到实例对象是否有任何后果,特别是如果 CustomTypeDescriptor 是动态的。

你们有什么感想?我的提供者的示例代码如下:

0 投票
1 回答
741 浏览

c# - ICustomTypeDescriptor 实现时抛出参数异常

我想从我的 PropertyGrid 中的可浏览属性中排除 Property MiddleName。

当我在我的 Person 类上的 ICustomTypeDescriptor 接口上闲逛时,我在启动我的应用程序时遇到了这个异常。

我错了什么?

System.ArgumentException:无法绑定到 DataSource 上的属性或列 TestNamefür。参数名称:dataMember bei System.Windows.Forms.BindToObject.CheckBinding() bei System.Windows.Forms.Binding.SetListManager(BindingManagerBase bindingManagerBase) bei System.Windows.Forms.ListManagerBindingsCollection.AddCore(Binding dataBinding)

更新+解决方案:

标有 的属性Browseable(false)不能绑定!所以我这样做了:

为什么 Browsable 属性使属性不可绑定?

Marc Gravell的最后一个解决方案就像呼吸一样!

0 投票
1 回答
1849 浏览

c# - WPF Datagrid 数据绑定到具有静态属性的类和包含动态属性值条目的字典

更新

我正在更新这篇文章,因为我做了更多阅读并决定重新实现我的解决方案。

原始问题:我有一个具有静态属性的类和一个属性,它是属性的动态集合(通过字典)。我想将我的类数据绑定到 wpf 数据网格,其中每个静态属性应该是一列,每个字典条目应该是网格中的一列。

在做了更多研究之后,我决定实现一个 PropertyBag 类,它将包含我的属性和值字典。现在几乎一切正常。我的网格显示了所有正确的列,并且正确应用了静态属性值。

但是,现在我无法从字典中获取任何要应用于网格的值,而且我不确定从这里去哪里。

更多信息:

我的数据库有 3 个表,一个板块,一个类别,一个类别板块关联表。每个板块可以有 0 到多个类别。现在,我正在用所有类别填充每个板块并将字符串设置为空。然后,当返回关联时(在板和类别之间),我在特定类别名称上设置实际值。这一切都发生在网格创建之前。

属性包:

修订版类

修改后的 CustomTypeDescriptor:

修改后的 PropertyDescriptor

简单的视图模型