簡體   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