Предполагается создать контейнер для контролов который будет по идеологии IoC работать с ними.
Рассуждения следующие :
1. Каждый контрол состоит из 2х частей , значение Value и состояние Enabled, Visible.
Соотвественно нужно описать 2 интерфейса
interface IControlValue<T>
{
T Value { get; set; }
}
interface IControlVisual
{
bool IsEnabled { get;set;}
bool IsVisible { get;set;}
}
но вот затык , подумал
а) ведь еще нужно как-то указать где данный контрол будет располагаться, а это зависит от типа контейнера, например где-то потребуется X,Y координаты, где-то координаты в Grid ( row,column), где-то вообще координат не нужно ( DockPanel, StackPanel в WPF ).
б) еще есть контролы которым нужен какой-то заголовок, например RadioButton, Checkbox.
Как быть , наследоваться от IControlVisual и добавлять в новый интерфейс Caption ?
interface IControlVisualCaption : IControlVisual
{
string Caption { get;set;}
}
тут возник еще вопрос , а не стоит ли тут применить не наследование а некий декоратор, чтобы можно было комбинировать разные варианты, только вот как это будет выглядеть ?
в) еще есть контролы для работы со списками, например ComboBox. Можно отнаследоваться от IControlValue<T>
interface IControlMultiValue<T> : IControlValue<T>
{
IEnumerable<T> Items { get;set;}
}
но ведь еще эти Items нужно откуда-то загрузить , тут наверное лучше добавить интерфейс IItemsProvider<T> ?
interface IControlMultiValue<T> : IControlValue<T>
{
IEnumerable<T> Items { get;set;}
IItemsProvider ItemsProvider { get;set;}
}
2) Но контролы могут быть составными, например Range контрол, содержит 2 контрола + лейбл между ними , [ ] по [ ]
как вот тут лучше реализовать ? Делать интерфейс с ValueMax, ValueMin и LabelCaption или иначе ? как это все обобщить с IControlValue<T>, ведь список контролов в контейнере должен содержать какой-то базовый интерфейс.