我想在我的PropertyGrid
中顯示一個類的多個實例。這個類看起來是這樣的:PropertyGrid只讀對象級屬性
public class Parameter
{
[Description("the name")]
public string Name { get; set; }
[Description("the value"), ReadOnly(true)]
public string Value { get; set; }
[Description("the description")]
public string Description { get; set; }
}
我有一個TreeView
那類的實例。當我在TreeView
中選擇其中一個時,按預期顯示在PropertyGrid
中。到目前爲止這麼好,但我想通過以下方式自定義此行爲:
對於每個單個實例,我希望能夠防止用戶修改特定屬性。通過在我的課程中設置ReadOnly(true)
(如上例所示),所有Value
屬性將在級別上被禁用。
經過一番研究,我發現下面的解決方案,它使我有機會來啓用/禁用特定屬性在運行時:
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(this)["Value"];
ReadOnlyAttribute attr =
(ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
FieldInfo isReadOnly = attr.GetType().GetField(
"isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
isReadOnly.SetValue(attr, false);
,這個方法工作得很好,但不幸的是也只有類級別。這意味着如果我將Value
的isReadOnly
設置爲false
,全部我的Parameter
-對象具有Value
屬性可寫。但我只想在這一個特定的對象上(因此對象級別)。我真的不想爲讀/寫和只讀屬性創建單獨的類。
由於我運行的想法,你的幫助是非常讚賞:)
提前感謝!
編輯:我需要只讀屬性變灰,所以用戶可以看到它不允許或可能編輯它們。
我已閱讀整個文檔,但仍不明白你的想法。你能否給我提供一個小代碼示例以使它更清晰一些?感謝您的時間:) –
請參閱該文章中的*動態用法*段落。簡而言之:將PropertyAttributesProviderAttribute應用於您的屬性,編寫您自己的提供程序,並根據對象本身(而不是該類)從PropertyAttributes集合中替換屬性。 –
正如我在源代碼中可以看到的,這需要使用作者自定義的PropertyGrid實現來使其工作?在我的情況下,我必須使用DLL中的現有PropertyGrid(我不能修改)。 –