Сеттер недвижимости не вызывается сбором
-
04-10-2019 - |
Вопрос
У меня есть пользовательский контроль, который имеет Items
имущество. Я применил EditorAttribute
с А. UITypeEditor
Тип CollectionEditor
.
Тип коллекции:
[Serializable]
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public class ListItemsCollection : CollectionBase
{
// methods
}
Декларация недвижимости в контроле:
private new ListItemsCollection _Items;
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public new ListItemsCollection Items
{
get
{
return _Items;
}
set
{
_Items = value;
// do other UI changes
}
}
Проблема:
Когда я бросаю этот элемент управления на поверхность дизайнера, я могу добавить элементы в свойство элементов, используя PropertyGrid
. Отказ Но, когда я нажимаю Ok
Кнопка CollectionEditor
сеттер Items
Собственность не вызывается.
AFAIK, когда значение возвращается из EditValue
метод а. UITypeEditor
Класс Сеттерный блок свойства должен быть вызван.
Это сводит меня с ума. Я даже попытался добавить Event
к ListItemsCollection
, Так что, когда добавляются предметы, я могу, все, что я хочу с UI управления.
Это не должно быть сложно. Что я делаю неправильно?
Решение
Я пытаюсь воспроизвести вашу ситуацию: используя следующий код, я получаю окно сообщения, пока я редактирую список из окна свойства VS. Остерегайтесь, что вы должны создать список самостоятельно. Если вы не создаете его, vs Создайте список темп, которые вы можете редактировать из окна свойства, но не устанавливает свой свойство в этот список (чтобы ваш стержень никогда не будет вызван)
public UserControl1()
{
InitializeComponent();
list = new BindingList<ListViewItem>();
list.ListChanged += new ListChangedEventHandler(list_ListChanged);
}
void list_ListChanged(object sender, ListChangedEventArgs e)
{
MessageBox.Show(e.ListChangedType.ToString());
}
private BindingList<ListViewItem> list;
public BindingList<ListViewItem> List1
{
get { return list; }
}
Другие советы
Свойства коллекции должны быть только для чтения. Это коллекция, которая извлекается через Getter, и скорректирована. Устройство никогда не входит в него, потому что это будет означать настройку новой коллекции.