繁体   English   中英

如何在接口中声明事件处理程序?

[英]How to declare an event handler in an interface?

我有一些Silverlight 4 UI对象(更像它的“导航页面”)必须实现两件事: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导航框架托管在导航框架内。 那很好,但我还需要能够将子页面内发生的事件(例如错误)中继到父页面。 此外,我希望能够基于父级中发生的事件来强制刷新子页面UI。

为了避免使用反射(以查看导航面板中显示的页面的类型是什么),我想从中提取IDynamic UI。 这将允许我执行以下操作:

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方法进行操作,这会容易得多,但是该应用程序已经编写,因此我不会从头开始重写它。 :(

谢谢马丁

尝试将其定义为event Action<ErrorEventArgs> OnError;

创建一个接口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");
    }

输出:通知

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM