c# - 通过 .NET 中的某种接口(interface)使属性可用于数据绑定(bind)?

标签 c# data-binding interface

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

这种“特定方式”使得属性在数据绑定(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),但您需要实现 ICustomTypeDescriptorTypeDescriptionProvider .然后通过 TypeDescriptor.GetProperties(obj) 定义可用属性或 TypeDescriptor.GetProperties(type) - 或者在列表的情况下,通过 ITypedList . ICustomTypeDescriptor如果每个实例的属性都发生变化,则适用; TypeDescriptionProvider可以根据类型进行定制,并可以处理 BindingList<T> 之类的东西无需任何额外工作。

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

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

关于c# - 通过 .NET 中的某种接口(interface)使属性可用于数据绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1397868/

相关文章:

c# - Libgit2Sharp:在两个标签之间的所有提交中获取文件

listview - Obseravable Collection 在更改时不更新 ListView UI(Xamarin Forms 的 Prism)

c# - 通过绑定(bind)部分填充 MenuItem

iphone - 高级 iOS 界面设计?

java - 如何告诉 Java 接口(interface)实现了 Comparable?

c# - Windows Phone 8.1 中不包含 'RootVisual' 的定义

c# - 'System.OutOfMemoryException' : Error creating window handle

perl - 我如何告诉 Perl 的 IO::Socket::INET 使用哪个接口(interface)?

c# - 大型机平面文件到 C# 类

angular - 在组件之间共享数据(Angular 7)