Лучшее «соединение» между MyUserControl.List <NestedControl>и MyUserControl.Panel.Controls - PullRequest
1 голос
/ 15 июля 2009

На самом деле я написал UserControl, который действует как контейнер для других (давайте назовем это) NestedUserControls.

Я реализовал программный способ добавления таких NestedUserControls в свой UserControl (через функцию App(string name)). Но то, что я на самом деле больше люблю, это какой-то список в качестве публичного свойства для моего UserControl.

Но проблема в том, что мой NestedUserControl нужно поместить в список private UserControl.panel.Controls. В моей собственной написанной функции Add() это не большая проблема. Но как мне решить эту проблему, если я использую свойство List<NestedUserControl>? Я не получаю никакой информации о том, когда список каким-либо образом меняется.

Единственная идея, которую я на самом деле нашел, - это создать что-то вроде EventList<>, которое генерирует событие при каждом изменении списка. Так что это будет «правильный» путь или у вас есть какие-то более подходящие подходы (или, может быть, уже есть какой-то EventList в рамках .Net Framework?

О, прежде чем я забуду: я использую VS2008, C #, WinForms, .Net 3.5 SP1

Ответы [ 2 ]

1 голос
/ 15 июля 2009

Если я правильно понимаю ваш вопрос, вы должны либо использовать наблюдаемую коллекцию для хранения вложенных пользовательских элементов управления, к сожалению, я знаю только один из них в сборке WPF: http://msdn.microsoft.com/en-us/library/ms668604.aspx или, предпочтительно, предоставьте только IList<NestedUserControl> пользователям вашего usercontrol и реализуйте этот интерфейс таким образом, чтобы он делегировал большую часть работы UserControl.panel.Controls. Пример того, как реализовать IList: http://damieng.com/blog/2006/06/14/Observing_change_events_on_a_ListT

0 голосов
/ 17 июля 2009

Итак, чтобы получить больше ясности в этой проблеме, вот мое решение:

Я хотел бы добавить Список в мой UserControlContainer, который можно легко изменить во время выполнения или во время разработки. Чтобы заставить его корректно работать во время разработки, мне пришлось наследовать от CollectionBase вместо List <> и добавить атрибут DesignerSerializationVisibility (DesignerSerializationVisibility.Content). Сама CollectionBase предоставляет некоторые события для вставки, удаления и очистки.

После реализации этих функций и добавления запуска моего собственного определенного события ListChangedEvent во внешний мир, я смог получить информацию о любом изменении списка.

Единственная проблема, с которой вы столкнетесь, заключается в том, что CollectionEditor не удалит никакие объекты из вашего списка. Вместо этого, кажется, работает со вторым внутренним списком. После нажатия ОК ваш список будет очищен и заполнен другими событиями. Так что не пропустите функции CollectionBase.OnClear или CollectionBaseOnClearComplete!

...