c# - 您可以/如何在运行时为 PropertyGrid(对于 PCL)指定编辑器?

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

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

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

最佳答案

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

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 ;
    

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

enter image description here

关于c# - 您可以/如何在运行时为 PropertyGrid(对于 PCL)指定编辑器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46099675/

相关文章:

c# - 为自定义用户控件创建工具提示

c# - 只使用 SqlConnection SqlCommand 和 SqlDataReader 做数据访问层可以吗

c# - 二维遍历的最佳数据结构?

c# - 将 Env Conn String 注入(inject) .NET Core 2.0 w/EF Core DbContext 与 Startup prj 不同的类库中并实现 IDesignTimeDbContextFactory

c# - 在标签文本中显示文件名

c# - 以编程方式在 DataGridView 中设置列​​宽

c# - 用于 C# 2015 的 WebKit

c# - 使用 Renci.SSH 到 MySQL 服务器的 SSH 访问

c# - 寻找一个好的 C# 异常记录工具

c# - 是否可以覆盖 ASP.NET MVC 中 [Authorize] 的默认行为?