我有一个以特定方式实现属性的类,用于处理我们业务逻辑系统的一些自定义需求。
这种“特定方式”使得属性在数据绑定(bind)的上下文中不可操作。基本上,如果我将我们类的一个对象放到表单上,数据绑定(bind)在该对象上找不到任何内容,并且该对象的属性检查器虽然列出了属性,但不允许我编辑它们。
我想知道是否有一个接口(interface)或类似的接口(interface)可以在我的类中实现,它会向表单设计器报告可以绑定(bind)哪些属性,并实现与数据绑定(bind)系统对话所必需的自定义代码代表我的属性(property)。
请注意,我不需要能够在属性检查器中为我的对象编辑属性值,这只是属性无功能的一个示例。我只需要数据绑定(bind)支持。
是否有这样的接口(interface),如果有,它是什么?
举个简单的例子。
假设我有这个类:
public class CustomDataBinding : Component
{
private Dictionary<String, Object> _Properties = new Dictionary<String, Object>();
public CustomDataBinding()
{
_Properties["Property1"] = 10;
_Properties["Property2"] = "Test";
}
}
除了实际创建属性之外,我还能对我的对象做些什么来为这两个“属性”添加数据绑定(bind)支持吗?
请注意,对于我的真实类,我知道每个属性的类型,所以如果它更容易,请将上面的代码更改为仅使用字符串值:
public class CustomDataBinding : Component
{
private Dictionary<String, String> _Properties = new Dictionary<String, String>();
public CustomDataBinding()
{
_Properties["Property1"] = "Property1";
_Properties["Property2"] = "Property2";
}
}
我还需要验证支持,因为我们的类也可以报告每个属性的验证状态,但我已经实现了 IDataErrorInfo 和 IDataValidationInfo,我认为它们会给我这些。我还实现了 INotifyPropertyChanged,因此我认为我已经有了更改机制,但我需要发现属性并与之对话。除了这些接口(interface)之外,我应该研究的任何其他信息都是受欢迎的信息。
最佳答案
听起来你在描述一个属性(property)包;这确实支持数据绑定(bind),但您需要实现 ICustomTypeDescriptor
或 TypeDescriptionProvider
.然后通过 TypeDescriptor.GetProperties(obj)
定义可用属性或 TypeDescriptor.GetProperties(type)
- 或者在列表的情况下,通过 ITypedList
. ICustomTypeDescriptor
如果每个实例的属性都发生变化,则适用; TypeDescriptionProvider
可以根据类型进行定制,并可以处理 BindingList<T>
之类的东西无需任何额外工作。
棘手的事情是您需要定义每个属性的类型 - 如果您只有object
,这并不简单。 . Here is a very simplified example ,它将所有属性视为字符串。在这个例子中,因为我们正在绑定(bind)一个列表,所以它使用 ITypedList
但没有实现 ICustomTypeDescriptor
.
注意对于 PropertyGrid
, 一个更简单的快捷方式是使用 TypeConverter
- 这允许您调整属性而不必使用ICustomTypeDescriptor
或 TypeDescriptionProvider
- see example .
关于c# - 通过 .NET 中的某种接口(interface)使属性可用于数据绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1397868/