Я имел дело с несколькими пользовательскими элементами управления, которые должны были отвечать на один и тот же фрагмент пользовательского ввода.
Я создал базовую страницу, унаследованную от System.Web.UI.Page. Я включил пользовательский ввод как свойство здесь (подробнее об этом позже).
Я определил этот интерфейс
public interface IRespondToInput
{
int InputID
{
get;
set;
}
}
Хорошо, это не называлось точно , но каждый пользовательский элемент управления, который я хотел, чтобы изменения были реализованы. Этот интерфейс состоит из одного свойства, которое отражает свойство на базовой странице.
public int InputID
{
get
{
return _inputID
}
set
{
_inputID = value;
SetInputs(this, _inputID);
}
}
В установщике метода базовой страницы я вызываю процедуру, которая рекурсивно перепрыгивает через иерархию элементов управления, ища что-либо, реализующее IRespondToInput , устанавливая свойство всякий раз, когда был найден пользовательский элемент управления, соответствующий этому интерфейсу. (см. код)
protected void SetInputs( Control theControl, int theInputID )
{
if (theControl.Controls.Count > 0)
{
foreach (Control mySubControl in theControl.Controls)
{
if (mySubControl is UserControl || mySubControl is System.Web.UI.HtmlControls.HtmlForm)
{
if (mySubControl is IRespondToInput)
{
((IRespondToInput)mySubControl).InputID = theInputID;
}
SetInputs(mySubControl, theInputID);
}
}
}
}
Это, в свою очередь, вызовет локальные события привязки на пользовательском элементе управления.
По правде говоря, я мог бы вызвать свойство из унаследованной страницы.
например. (в коде управления пользователя сзади)
int mySetting = ((MyBasePage)Page).InputID;
Я просто хотел поместить совместимые элементы управления на совместимую страницу и заставить их работать. Этот подход может работать для вас.
Добавлено для оригинального плаката
Если вы не хотите помещать эту логику в производную базовую страницу, почему бы не создать отдельный UserControl (D - продолжение вашего примера), который инкапсулирует вашу логику переключения, но также находит все элементы управления, реализующие IRespondToInput интерфейс
В этом UserControl ваш установщик будет выглядеть так: -
public int InputID
{
get
{
return _inputID
}
set
{
_inputID = value;
SetInputs(Page, _inputID);
}
}
Включить этот элемент управления в качестве элемента управления UserControls A, B и C.
Таким образом, вам не нужно делать каждую страницу ADerivedPage - вы можете просто разместить элементы управления пользователя на тех страницах, где они вам нужны. И вы будете в порядке, передавая Page
в качестве параметра, поскольку он наследуется от Control
.