我在那里写了一个带有自定义对象的PCL,然后我创建了一个GUI来处理来自PCL的对象......我尝试使用PropertyGrid来编辑属性......我已经按顺序阅读了为了让网格知道如何处理对象,我需要指定EditorAttribute以及提供TypeConverter ......但我不认为我可以在PCL中添加这两个...
有没有办法在GUI级别处理这个问题,比如告诉PropertyGrid在运行时使用特定类型的Editor / TypeConverter?我浏览了网格的可用功能/属性列表,看起来不太可能。
答案 0 :(得分:2)
您可以创建包含与原始类相同属性的元数据类,并使用某些属性修饰元数据类的属性。然后告诉类型描述符使用元数据类为原始类提供类型描述:
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 ;
以下是运行应用程序后的结果: