我有一些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 apprach被用于制作它,它会更容易,但应用程序已经编写,我不会从头开始重写它。 :(
由于 马丁
答案 0 :(得分:1)
尝试将其定义为event Action<ErrorEventArgs> OnError;
答案 1 :(得分:0)
创建一个界面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");
}
输出:知情