通过.NET中的某种接口使属性可用于数据绑定?

时间:2009-09-09 06:35:44

标签: c# data-binding interface

我有一个以特定方式实现属性的类,用于处理业务逻辑系统的一些自定义需求。

这种“特定方式”使得属性在数据绑定的上下文中不可操作。基本上,如果我将类的对象放到表单上,数据绑定在对象上找不到任何内容,并且该对象的属性检查器虽然列出了属性,但不允许我编辑它们。

我想知道的是,我是否可以在我的类中实现一个接口或类似的接口,它将向表单设计器报告可以绑定的属性,并实现与数据绑定系统通信所需的自定义代码代表我的财产。

请注意,我不需要在属性检查器中编辑对象的属性值,这只是属性不具备功能的一个示例。我只需要数据绑定支持。

是否有这样的界面,如果有,那是什么?

让我们举一个简单的例子。

我们假设我有这门课程:

public class CustomDataBinding : Component
{
    private Dictionary<String, Object> _Properties = new Dictionary<String, Object>();

    public CustomDataBinding()
    {
        _Properties["Property1"] = 10;
        _Properties["Property2"] = "Test";
    }
}

除了实际制作属性之外,我能对我的对象做些什么,这会为这两个“属性”添加数据绑定支持吗?

请注意,对于我的真实类,我知道每个属性的类型,因此如果它更容易,请将上面的代码更改为仅使用字符串值:

public class CustomDataBinding : Component
{
    private Dictionary<String, String> _Properties = new Dictionary<String, String>();

    public CustomDataBinding()
    {
        _Properties["Property1"] = "Property1";
        _Properties["Property2"] = "Property2";
    }
}

我还需要验证支持,因为我们的类也可以报告每个属性的验证状态,但我已经实现了IDataErrorInfo和IDataValidationInfo,我认为它会给我这个。我也实现了INotifyPropertyChanged,所以我想到了改变机制,但我需要发现并与属性交谈。除了这些接口之外,我应该研究的任何其他内容都是受欢迎的信息。

3 个答案:

答案 0 :(得分:5)

听起来你在描述一个属性包;这确实支持数据绑定,但您需要实现ICustomTypeDescriptorTypeDescriptionProvider。然后,可以通过TypeDescriptor.GetProperties(obj)TypeDescriptor.GetProperties(type)定义可用的属性,或者在列表的情况下,通过ITypedList定义。 ICustomTypeDescriptor适用于属性每个实例更改的情况; TypeDescriptionProvider可以执行每种类型的自定义,并且可以使用BindingList<T>之类的内容而无需任何额外的工作。

棘手的是你需要定义每个属性的类型 - 如果你刚刚获得object则不是很简单。 Here is a very simplified example,将所有属性视为字符串。在此示例中,因为我们绑定了一个列表,所以它使用ITypedList但未实现ICustomTypeDescriptor

请注意,对于PropertyGrid,更简单的快捷方式是使用TypeConverter - 这样您就可以调整属性,而无需使用ICustomTypeDescriptor或{ {1}} - see example

答案 1 :(得分:1)

您可以始终将Dictionary作为属性公开并直接访问它的元素(尽管它需要通过索引并实现IListSourceIEnumerable

- 编辑

但是,我必须说,你正在有效地制作自己的无类型语言。对此的原因感兴趣,也许有更好的方法...

答案 2 :(得分:1)

由于您无法发布新属性,如何将Dictionary发布为ObservableDictionary&lt; string,object&gt;。请参阅this DrWPF article

然后,您可以使用key绑定到字典,以获取您所追求的命名属性。