У меня есть интерфейс с кучей свойств, некоторые из которых определены как неизменяемые, например:Readonly свойство на интерфейсе редактирования в PropertyGrid
public interface IActivity {
string Id { get; }
bool IsEnabled { get; }
}
Класс, который реализует этот интерфейс имеет государственные set
методы, для использовать в другом месте, но потребитель этого интерфейса не должен устанавливать эти свойства. Теперь я создаю тестового потребителя и выставляю объект через элемент управления PropertyGrid. Поскольку он привязан к классу с помощью методов общедоступных множеств, свойства, которые только для чтения могут касаться потребителя, редактируются в сетке.
я могу решить эту проблему двумя способами, во-первых, делая сеттеры internal
или пометив свойства с атрибутом [ReadOnly]
, однако это не похоже, «право», так как в теории что-то еще может реализовать этот интерфейс из из моего контроля, с теми, которые предположительно readonly свойства затем изменяемые через сетку свойств.
Я попытался явно приведение к интерфейсу при назначении объекта в таблицу свойств, но это не помогло:
propGrid.SelectedObject = (IActivity)obj;
Есть ли способ заставить контроль PropertyGrid уважать Контракт Интерфейс, вместо того, чтобы менять конкретные классы?
Сетка, вероятно, использует отражение, чтобы определить, какие столбцы она должна отображать и могут ли эти столбцы редактироваться или нет. Поскольку объект, который вы передаете, имеет тип, который позволяет редактировать свойства, вы не можете сделать это очень много. И приведение его к некоторому более ограниченному типу не поможет, потому что 'SelectedObject' ожидает« объект »в любом случае. – poke
Да, это то, что я понял, оно должно быть отражено с учетом других атрибутов, которые вы можете применить для изменения поведения в сетке. Просто надеялся, что может быть способ заставить его следовать интерфейсу –