我正在使用自定义类,并有一个事件处理程序来监视属性,只在特定情况下作出反应.
这是基类的片段:
public class PageView
{
private UIView activePage;
public List<UIView> Pages { get; set; }
public delegate void PageChangedEventHandler(object sender, PageChangedEventArgs e);
public event PageChangedEventHandler PageChanged;
public UIView ActivePage
{
get { return activePage; }
set
{
if (!activePage.Equals(value))
{
activePage = value;
OnPageChanged();
}
}
}
protected virtual void OnPageChanged()
{
if (PageChanged != null)
PageChanged(this, new PageChangedEventArgs(Pages.IndexOf(activePage)));
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在子类中尝试做的事情:
public class LoopingPageView : PageView
{
protected override void OnPageChanged()
{
if (PageChanged != null &&
Pages.IndexOf(ActivePage) > 0 &&
Pages.IndexOf(ActivePage) < Pages.Count - 1)
PageChanged(this, Pages.IndexOf(ActivePage) - 1);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到的消息是PageChanged只能存在于+ =或 - =语句的左侧.处理这种情况的正确方法是什么?
PageChanged是一个类似场的事件.从声明类外部 - 甚至在子类中 - 您只能使用它来订阅和取消订阅事件.
这里的解决方案通常是简单地委托OnPageChanged有条件的基本实现:
public class LoopingPageView : PageView
{
protected override void OnPageChanged()
{
int pageIndex = Pages.IndexOf(ActivePage);
if (pageIndex > 0 && pageIndex < Pages.Count - 1)
{
base.OnPageChanged();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,您还尝试更改传递给处理程序的值.您无法使用当前设置执行此操作.
如果你真的需要这样做(对我来说似乎很奇怪,并且违反了最少惊喜的原则 - 子类与基类的行为明显不同)你应该OnPageChanged()委托一个带有页面索引的重载(或者 - PageChangedEventArgs)在这种情况下,您的覆盖OnPageChanged()可以使用不同的索引调用它.例如:
protected virtual void OnPageChanged()
{
OnPageChanged(new PageChangedEventArgs(Pages.IndexOf(activePage));
}
// Note: this doesn't need to be virtual.
protected void OnPageChanged(PageChangedEventArgs args)
{
// Null-safe event raising
var handler = PageChanged;
if (handler != null)
{
handler(this, args);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在派生类中:
protected override void OnPageChanged()
{
int pageIndex = Pages.IndexOf(ActivePage);
if (pageIndex > 0 && pageIndex < Pages.Count - 1)
{
base.OnPageChanged(new PageChangedEventArgs(pageIndex - 1));
}
}
Run Code Online (Sandbox Code Playgroud)