【问题标题】:Can you/How to specify Editor at runtime for PropertyGrid (for PCL)?您/如何在运行时为 PropertyGrid 指定编辑器(对于 PCL)?
【发布时间】:2018-02-16 09:19:10
【问题描述】:

我在那里编写了一个带有自定义对象的 PCL,然后我创建了一个 GUI 来处理来自 PCL 的对象...我尝试使用 PropertyGrid 来编辑属性...我已经按顺序阅读了为了让网格知道如何处理该对象,我需要指定 EditorAttribute 并提供一个 TypeConverter ......但我认为我不能在 PCL 中添加这 2 个......

有没有办法在 GUI 级别处理这个问题,比如告诉 PropertyGrid 在运行时使用特定类型的 Editor/TypeConverter?我浏览了网格的可用功能/属性列表,看起来不可能。

【问题讨论】:

  • 查看ICustomTypeDescriptor,这将让您在运行时动态提供类型信息。即属性及其属性。谷歌搜索“icustomtypedescriptor propertygrid c#”。
  • 是的,但您不需要在对象类本身中添加TypeConverter 或实现ICustomTypeDescriptor 吗? ICustomTypeDescriptor 虽然不是 PCL。
  • 在运行时注册一个自定义的TypeDescriptionProvider 是您正在寻找的。您可以自己创建TypeDescriptionProviderTypeDescriptor,然后将提供程序注册到您的类,以便使用您创建的类型描述符类提供自定义类型描述。此外,作为更清洁和更简单的选项,您可以创建一个包含与原始类相同属性的元数据类,并使用一些属性装饰元数据类的属性。然后使用AssociatedMetadataTypeTypeDescriptionProvider 使用元数据类为您的类提供类型描述。

标签: c# .net winforms portable-class-library propertygrid


【解决方案1】:

您可以创建一个包含与原始类相同属性的元数据类,并使用一些属性装饰元数据类的属性。然后告诉类型描述符使用元数据类为您的原始类提供类型描述:

var provider = new AssociatedMetadataTypeTypeDescriptionProvider(
    typeof(MyClass),
    typeof(MyClassMetadata));
TypeDescriptor.AddProvider(provider, typeof(MyPortableClass));

PropertyGrid 控件使用类的类型描述符来显示类的属性、显示名称、描述、编辑器等。您可以通过不同的方式分配类型描述符。

就您而言,最好的解决方案是在运行时为您的班级注册一个新的TypeDescriptorProvider。这样您就可以在运行时更改 PropertyGrid 中类的外观。

使用AssociatedMetadataTypeTypeDescriptionProvider,您可以为您的类创建一个类型描述符提供程序,该提供程序使用元数据类来提供类型描述。然后你可以使用TypeDescriptor.AddProvider注册提供者。

通过这种方式,您可以为您的类引入一个元数据类,其中包含属性的属性。

分步示例

  1. 向解决方案添加可移植类库并向其添加类:

    public class MyClass
    {
        public string Property1 { get; set; }
        public string Property2 { get; set; }
    }
    
  2. 将可移植类库的引用添加到您的 Windows 窗体项目。只要确保目标框架一致即可。

  3. System.DesignSystem.ComponentModel.DataAnnotations 引用添加到您的 Windows 窗体项目。

  4. 在 Windows 窗体项目中,为您的可移植类添加一个元数据类。该类应包含与原始类完全相同的属性:

    public class MyClassMetadata
    {
        [Category("My Properties")]
        [DisplayName("First Property")]
        [Description("This is the first Property.")]
        public string Property1 { get; set; }
    
        [Category("My Properties")]
        [DisplayName("Second Property")]
        [Description("This is the second Property.")]
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
        public string Property2 { get; set; }
    }
    

    你需要添加这些用法:

    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.Design;
    using System.Drawing.Design; 
    
  5. 在表单的Load 事件中,以这种方式为您的类型注册元数据提供程序:

    var provider = new AssociatedMetadataTypeTypeDescriptionProvider(
        typeof(MyClass),    
        typeof(MyClassMetadata));
    TypeDescriptor.AddProvider(provider, typeof(MyClass));
    
  6. 在属性网格中显示可移植类的实例:

    var myObject = new MyClass();
    this.propertyGrid1.SelectedObject = myObject ;
    

这是应用程序运行后的结果:

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多