JDunkerley правильно понял. Но позвольте мне объяснить, как отделить его с помощью MVP, чтобы вы могли избегать проблем с дизайном, о которых говорит Хайко Хатцфельд.
По сути, реализуйте шаблон MVP как для вашего элемента управления, так и для главной страницы. Смотрите здесь для получения инструкций о том, как это сделать. Объявите метод, который вы хотите вызвать в интерфейсе мастера (IMasterView). Затем создайте класс, который будет контролировать отношения между двумя компонентами; мы назовем его классом PageController. Поместите экземпляр этого класса в состояние запроса для каждого запроса, добавив следующую строку в global.asax.cs:
/* global.asax.cs */
protected void Application_BeginRequest(object sender, EventArgs e)
{
// ...
HttpContext.Current.Items["Controller"] = new PageController();
// ...
}
Затем вы можете получить доступ к этому экземпляру из каждого докладчика (ведущего и управляющего) через следующую строку кода:
var controller = HttpContext.Current.Items["Controller"] as PageController;
Затем вы можете реализовать событие или какой-либо другой механизм, чтобы позволить элементу управления вызывать метод на ведущем устройстве без привязки через этот общий объект. Например:
/* PageController.cs */
public event EventHandler SomeEvent;
protected virtual void OnSomeEvent(EventArgs e)
{
Debug.Assert(null != e);
var handler = this.SomeEvent;
if (null != handler)
handler(this, e);
}
public void FireSomeEvent()
{
this.OnSomeEvent(EventArgs.Empty);
}
/* ControlPresenter.cs */
public ControlPresenter(IControlView view)
: base()
{
view.EventFired += (sender, e) =>
{
var controller = HttpContext.Current.Items["Controller"] as PageController;
controller.FireSomeEvent();
};
}
/* MasterPresenter.cs */
public MasterPresenter (IMasterView view)
: base()
{
var controller = HttpContext.Current.Items["Controller"] as PageController;
controller.SomeEvent += (sender, e) => view.MyFunction();
}
Убедитесь, что событие «EventFired» объявлено в интерфейсе вашего элемента управления (IControlView) и реализовано в элементе управления. Тогда все, что вам нужно сделать, чтобы повлиять на мастера (вызвать его метод), это запустить это событие, а MVP + PageContoller позаботится об остальном.
* +1015 * Приветствия