Как обработать дополнительный атрибут свойства в CollectionEditor, чтобы скрыть свойство?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как обработать дополнительный атрибут свойства в CollectionEditor, чтобы скрыть свойство?

Сообщение Anonymous »

У меня есть приложение с двумя редакторами. Назовем их «Редактор клиентов» (CEditor) и «Редактор моделей» (MEditor).
Давайте дадим вам больше контекста, в надежде, что это не приведет к созданию романа:
Существует конфигурация, которую можно редактировать обоими редакторами. Существует свойство узла дерева, которое раньше можно было редактировать с помощью 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
Внутри класса PickerBase я установил атрибут Browsable для Searcher установлено значение false и добавлен BrowsableInEditor(

Код: Выделить всё

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() =>
...
}
Я добавил новый класс, унаследованный от CollectionEditor, который может определять, находится ли он в режиме редактора клиентов или в режиме редактора моделей, проверяя владельца редактора:

Код: Выделить всё

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:
публичный класс 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;
}
(IContextAwareTypeDescriptor наследует от ICustomTypeDescriptor и добавляет свойство CustomerEditorMode)
А 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);
...
Проблема в том, что это не работает. Когда я устанавливаю точку останова в методе GetProperties PickersList, она не срабатывает.
Итак, вопрос в том, что я делаю неправильно, или, может быть, TL ;DR: как я могу скрыть свойство класса внутри (настраиваемого) CollectionEditor (связанного атрибутом Editor), но не в целом, а выборочно, используя контекстную информацию.

Подробнее здесь: https://stackoverflow.com/questions/793 ... hide-a-pro
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»