У меня есть несколько объектов пользовательского интерфейса Silverlight 4 (страницы навигации более похожи на него), которые должны реализовывать две вещи: обработчик события OnError и метод Refresh ().
Итак, я попробовал следующее:
public interface IDynamicUI
{
event EventHandler<ErrorEventArgs> OnError;
void Refresh();
}
public class ErrorEventArgs : EventArgs
{
public string Message { get; set; }
public Exception Error { get; set; }
}
но компилятор выдает мне сообщение о том, что поля не могут быть объявлены внутри открытых интерфейсов.
Что ж, проблема в том, что страницы, которые должны это реализовать, размещаются внутри фрейма навигации с использованием фреймворка SL4. Это хорошо, но мне также нужно иметь возможность передавать события, которые происходят на дочерней странице (например, ошибки), на родительскую страницу. Более того, я хотел иметь возможность принудительно обновлять пользовательский интерфейс дочерних страниц на основе событий, которые происходят в родительском.
Чтобы обойти использование отражения (чтобы увидеть, какой тип страницы отображается на панели навигации), я хотел просто извлечь из нее интерфейс IDynamic. Это позволило бы мне сделать что-то вроде этого:
public class ParentPage : Page
{
IDynamicUI selectedUI = null;
//fires when the ChildContent frame loads a child page...
private void ChildContentFrame_Navigated(object sender, NavigationEventArgs e)
{
object childPage = ChildContentFrame.Content;
this.selectedUI = (IDynamicUI)childPage;
this.selectedUI.OnError += new EventHandler(ChildPage_OnError);
}
private void ChildPage_OnError(object sender, ErrorEventArgs e)
{
//do my error handling here.
}
}
Для всех вас, кто является поклонниками MVVM / MVC ... ну, это не так. Я действительно знаю, что если бы для этого понадобился метод MVVM, это было бы намного проще, однако приложение уже было написано, и я не собираюсь переписывать его с нуля. (
Спасибо
Martin