Как объявить обработчик событий в интерфейсе? - PullRequest
2 голосов
/ 19 октября 2011

У меня есть несколько объектов пользовательского интерфейса 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

Ответы [ 2 ]

1 голос
/ 19 октября 2011

попробуйте определить его как event Action<ErrorEventArgs> OnError;

0 голосов
/ 28 июля 2017

Создание интерфейса IInform

public interface IInform
{
    event EventHandler Inform;
    void InformNow();
}

Создание класса ImplementIInform

public class ImplementInform : IInform
{
    public event EventHandler Inform;

    public void InformNow()
    {
        OnInformed(new EventArgs());
    }

    private void OnInformed(EventArgs eventArgs)
    {
        if (Inform != null)
        {
            Inform(this, eventArgs);
        }
    }
}

Создание консольного приложения, как показано ниже..

   static void Main(string[] args)
    {
        IInform objInform = new ImplementInform();
        objInform.Inform +=new EventHandler(Informed);
        objInform.InformNow();
        Console.ReadLine();
    }

    private static void Informed(object sender, EventArgs e)
    {
        Console.WriteLine("Informed");
    }

Вывод: Информированный

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...