下面的代码表示我拥有的代码结构:
C#:
[TypeConverter(typeof(ExpandableObjectConverter))]
public class TestClass1 {
public TestClass2 TestProperty1 {get;} = new TestClass2();
}
[TypeConverter(typeof(ExpandableObjectConverter))]
public sealed class TestClass2 {
[TypeConverter(typeof(CollectionConverter))]
public ReadOnlyCollection<TestClass3> TestProperty2 {
get {
List<TestClass3> collection = new List<TestClass3>();
for (int i = 0; i <= 10; i++) {
collection.Add(new TestClass3());
}
return collection.AsReadOnly();
}
}
}
[TypeConverter(typeof(ExpandableObjectConverter))]
public sealed class TestClass3 {
[Category("Category 1")]
public string TestProperty3 {get;} = "Test";
}
VB.NET:
<TypeConverter(GetType(ExpandableObjectConverter))>
Public Class TestClass1
Public ReadOnly Property TestProperty1 As TestClass2 = New TestClass2()
End Class
<TypeConverter(GetType(ExpandableObjectConverter))>
Public NotInheritable Class TestClass2
<TypeConverter(GetType(CollectionConverter))>
Public ReadOnly Property TestProperty2 As ReadOnlyCollection(Of TestClass3)
Get
Dim collection As New List(Of TestClass3)
For i As Integer = 0 To 10
collection.Add(New TestClass3())
Next
Return collection.AsReadOnly()
End Get
End Property
End Class
<TypeConverter(GetType(ExpandableObjectConverter))>
Public NotInheritable Class TestClass3
<Category("Category 1")>
Public ReadOnly Property TestProperty3 As String = "Test"
End Class
问题出在TestProperty3上。当它是只读的时候,属性网格中不会显示类别(“Category 1”)...
但如果我将该属性设置为可编辑,则类别将会显示...
C:#
[Category("Category 1")]
public string TestProperty3 {get; set;} = "Test";
VB.NET:
<Category("Category 1")>
Public Property TestProperty3 As String = "Test"
此外,让我们想象一下,在 TestClass3 中声明了10个属性(而不是像这个例子中的1个),其中9个是只读的,而1个是可编辑的,则在这种情况下所有类别都将显示。另一方面,如果所有10个属性都是只读的,则不会显示类别。
对于我来说,PeopertyGrid的这种行为非常令人恼火和意外。无论我的类中是否声明了具有setter或没有setter的属性,我都希望看到我的自定义类别。
我有哪些替代方案可以展示所有属性都是只读的类别?也许编写自定义TypeConverter或集合编辑器可以修复这种令人讨厌的可视化表示行为吗?
set
(具有setter但实际上不设置任何内容)的属性的只读方面。也许这不是完美的解决方案,但它可能会有用。 - JimiTypeDescriptionProvider
,添加一些缺失的功能。 - Jimi