[英]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.