你能/如何在运行时为PropertyGrid指定编辑器(对于PCL)?

时间:2017-09-07 15:04:09

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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 ;
    
  7. 以下是运行应用程序后的结果:

    enter image description here