【问题标题】:Make properties available for data binding through some kind of interface in .NET?通过 .NET 中的某种接口使属性可用于数据绑定?
【发布时间】:2010-11-26 17:45:35
【问题描述】:

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

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

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

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

有没有这样的接口,如果有,是什么?

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

假设我有这个类:

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,所以我认为更改机制到位,但我需要发现并与属性交谈。除了这些接口之外,我应该研究的任何其他信息都是受欢迎的信息。

【问题讨论】:

    标签: c# data-binding interface


    【解决方案1】:

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

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

    请注意,对于PropertyGrid,更简单的快捷方式是使用TypeConverter - 这允许您调整属性不必使用ICustomTypeDescriptorTypeDescriptionProvider - see example .

    【讨论】:

    • 我已经为列表做了这个,不知道同样的方法在这里是否有效,我正在尝试使用 ICustomTypeDescriptor 等待你们在这里回答,但我还有另一个问题,我会在这里接受这个问题的答案并提出另一个问题。
    • 这里是:stackoverflow.com/questions/1398109/…,基本上它围绕着我有缺陷/不完整的 ICustomTypeDescriptor 实现。
    【解决方案2】:

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

    -- 编辑

    不过,我必须说,您实际上是在制作自己的无类型语言。对这个原因感兴趣,或许有更好的办法……

    【讨论】:

      【解决方案3】:

      既然您不能发布新属性,那么将您的字典发布为 ObservableDictionary 怎么样。见this DrWPF article

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

      【讨论】:

      • 绝对值得研究,但目前 Marc 的答案看起来最有希望。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2021-08-12
      • 2016-03-27
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多