我在其中编写了一个带有自定义对象的 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
注册提供者.
这样您就可以为您的类引入一个元数据类,其中包含属性的属性。
分步示例
向解决方案中添加一个可移植类库并向其中添加一个类:
public class MyClass { public string Property1 { get; set; } public string Property2 { get; set; } }
将可移植类库的引用添加到您的 Windows 窗体项目。只要确保目标框架一致即可。
将
System.Design
和System.ComponentModel.DataAnnotations
引用添加到您的 Windows 窗体项目。在 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;
在表单的
Load
事件中,以这种方式为您的类型注册元数据提供程序:var provider = new AssociatedMetadataTypeTypeDescriptionProvider( typeof(MyClass), typeof(MyClassMetadata)); TypeDescriptor.AddProvider(provider, typeof(MyClass));
在属性网格中显示可移植类的实例:
var myObject = new MyClass(); this.propertyGrid1.SelectedObject = myObject ;
这是运行应用程序后的结果:
关于c# - 您可以/如何在运行时为 PropertyGrid(对于 PCL)指定编辑器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46099675/