Давайте дадим вам больше контекста, в надежде, что это не приведет к созданию романа:
Существует конфигурация, которую можно редактировать обоими редакторами. Существует свойство узла дерева, которое раньше можно было редактировать с помощью CEeditor и MEditor, назовем это свойство Pickers.
Редактирование доступно динамически. с производным от CollectionEditor.
Конфигурация сериализуется в виде XML.
Свойство Pickers представляет собой коллекцию элементов, они могут иметь тип PickerA. , ПикерБ, PickerC и т. д., но все они наследуют от PickerBase и имеют общее свойство Searcher, определенное в PickerBase.
Раньше для атрибута Browsable было установлено значение true, в результате чего свойство отображалось для редактирования в пользовательском CollectionEditor. Оба редактора использовали один и тот же элемент управления, назовем его ResponsiveDesigner, чтобы разместить древовидное представление, в котором при выборе определенного узла заполнялась сетка свойств и когда пользователь нажимал на Pickers. > свойство "..." откроется пользовательский CollectionEditor, предоставляя пользователю возможность редактировать средства выбора.
Теперь мне нужно Свойство Searcher этих различных типов средств выбора будет видимым (и, следовательно, редактируемым) только внутри CEditor, а не в MEditor.
Для этого я создал новый атрибут BrowsableInEditor с перечислением (BrowsableIn) со значениями:
- Both
- CEdtiorOnly
- MEditorOnly
Код: Выделить всё
BrowsableIn.CEditorOnly
Существовал существующий класс:
Код: Выделить всё
public class PickerConfigurationEditor : CollectionEditor
{
public PickerConfigurationEditor(Type type) : base(type) { }
protected override object CreateInstance(Type itemType) => base.CreateInstance(itemType);
protected override Type[] CreateNewItemTypes() =>
...
}
Код: Выделить всё
public abstract class ContextAwareCollectionEditor : CollectionEditor
{
private Form ParentForm { get; set; }
protected ContextAwareCollectionEditor(Type type) : base(type) { }
protected override object CreateInstance(Type itemType)
{
var instance = base.CreateInstance(itemType);
if (instance is IContextAwareTypeDescriptor list && ParentForm is {Owner: IContextAwareDesigner contextAwareDesigner})
{
list.CustomerEditorMode = contextAwareDesigner.CustomerEditorMode ;
}
return instance;
}
protected override CollectionForm CreateCollectionForm()
{
var collectionForm = base.CreateCollectionForm();
ParentForm = collectionForm.FindForm();
return collectionForm;
}
}
публичный класс PickerConfigurationEditor : ContextAwareCollectionEditor
{
public PickerConfigurationEditor (тип типа): base(type) {
Код: Выделить всё
protected override Type[] CreateNewItemTypes() =>
...
Код: Выделить всё
[Editor("xyz.PickerConfigurationEditor , xyz.UiExtensions", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public sealed class PickersList : List
, IContextAwareTypeDescriptor
{
public bool CustomerEditorMode { get; set; }
...
public PropertyDescriptorCollection GetProperties()
{
var pds = new PropertyDescriptorCollection(null);
for (var i = 0; i < Count; i++)
{
pds.Add(new PickerBaseDescriptor(this, i, CustomerEditorMode));
}
return pds;
}
А PickerBaseDescriptor выглядит следующим образом:
публичный запечатанный класс PickerBaseDescriptor: PropertyDescriptor
{
частный PickersList только для чтения _pickersList;
private readonly int _index = -1;
private readonly bool _customerEditorMode;
Код: Выделить всё
public PickerBaseDescriptor(PickersList list, int idx, bool customerEditorMode) :
base("#" + idx.ToString(), null)
{
_pickersList = list;
_index = idx;
_customerEditorMode= customerEditorMode;
}
public override bool IsBrowsable
{
get
{
var browsableAttr = Attributes.OfType
().FirstOrDefault();
if (browsableAttr?.Browsable == true) return true;
var editorAttr = Attributes.OfType
().FirstOrDefault();
return editorAttr?.BrowsableIn == BrowsableIn.Both || editorAttr?.BrowsableIn == BrowsableIn.KpfOnly && _customerEditorMode
|| editorAttr?.BrowsableIn == BrowsableIn.DesignerOnly && !_customerEditorMode;
}
}
public override AttributeCollection Attributes => new AttributeCollection(null);
...
Итак, вопрос в том, что я делаю неправильно, или, может быть, TL ;DR: как я могу скрыть свойство класса внутри (настраиваемого) CollectionEditor (связанного атрибутом Editor), но не в целом, а выборочно, используя контекстную информацию.
Подробнее здесь: https://stackoverflow.com/questions/793 ... hide-a-pro