如何更改事件处理程序在继承的类中工作的方式? -- c# 领域 和 .net-4.0 领域 相关 的问题

How would I change the way the event handler works in an inherited class?


3
vote

问题

中文

我正在使用自定义类,并有一个事件处理程序来观看属性,只在特定情况下反应。

以下是来自基类的片段:

  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)));     } }   

这是我在儿童课程中尝试做的事情:

  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);     } }   
但是,我收到PageChanged只能存在于+ = =或 - =语句的左侧的消息。这种情况的正确方法是什么?
英文原文

I am working with a custom class and have an event handler to watch a property and only react in specific cases.

Here is a snippet from the base class:

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)));     } } 

Here is what I am trying to do in the child class:

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);     } } 

However, I get the message that PageChanged can only exist on the left side of a += or -= statement. What is the correct way to handle this case?

     

回答列表

6
 
vote
vote
最佳答案
 

PageChanged 是一个像野外事件。来自声明类之外 - 即使在子类中 - 您只能使用它订阅并取消订阅事件。

这里的解决方案是正常是简单地委托给出 OnPageChanged(条件)的基本实现:

  public class LoopingPageView : PageView {     protected override void OnPageChanged()     {         int pageIndex = Pages.IndexOf(ActivePage);         if (pageIndex > 0 && pageIndex < Pages.Count - 1)         {             base.OnPageChanged();         }     } }   
但是,在这种情况下,您还在尝试更改传递给处理程序的值。您无法使用当前设置完成此操作。

如果您真的需要这样做(对我来说似乎奇怪,并违反了最不令人惊讶的原则 - 子类是对基类的显着不同)你应该制作 OnPageChanged() 委托给一个过载,它占用页面索引(或a - PageChangedEventArgs ),在这种情况下,您的覆盖 99887665 可以用不同的索引调用它。例如:

  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);     } }   

然后在派生类中:

  protected override void OnPageChanged() {     int pageIndex = Pages.IndexOf(ActivePage);     if (pageIndex > 0 && pageIndex < Pages.Count - 1)     {         base.OnPageChanged(new PageChangedEventArgs(pageIndex - 1));     } }   
 

PageChanged is a field-like event. From outside the declaring class - even within a subclass - you can only use it to subscribe to and unsubscribe from the event.

The solution here would normally be to simply delegate to the base implementation of OnPageChanged conditionally:

public class LoopingPageView : PageView {     protected override void OnPageChanged()     {         int pageIndex = Pages.IndexOf(ActivePage);         if (pageIndex > 0 && pageIndex < Pages.Count - 1)         {             base.OnPageChanged();         }     } } 

However, in this case you're trying to change the value which is passed to the handler as well. You can't do this with your current setup.

If you really need to do this (it seems odd to me, and violates the principle of least surprise - the subclass is acting significantly differently to the base class) you should probably make OnPageChanged() delegate to an overload which takes the page index (or a - PageChangedEventArgs) in which case your override of OnPageChanged() can call that with a different index. For example:

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);     } } 

Then in the derived class:

protected override void OnPageChanged() {     int pageIndex = Pages.IndexOf(ActivePage);     if (pageIndex > 0 && pageIndex < Pages.Count - 1)     {         base.OnPageChanged(new PageChangedEventArgs(pageIndex - 1));     } } 
 
 
   
   

相关问题

0  阅读您在Longlistelector中触摸的控件  ( Read the control that you touched in a longlistselector ) 
我有一个longlistelector来显示我在应用程序中的项目图库。 Longlistelelector的每个项目都有项目的图像,名称和图像,以在社交网络中分享它。问题是我需要知道当我触摸共享图像时要留给允许我们共享它的不同页面。这是LonglistleLector XAML: <phone:LongListS...

1  比较GUID时的例外  ( Exception when comparing guid ) 
我正在尝试获取包含具有特定ID的站点的所有类别的列表。以下是我略微修改的脚手架产生的方法。 array( [0] => <?php test 2 and test 4 test 6 ?> [1] => <?php ...

1  当启用TinyCache插件时,ImageResizer不再工作  ( Imageresizer not longer working when tinycache plugin is enabled ) 
我正在尝试使用TinyCache插件的ImageResizer。 (我将在imageResizer基本版上)。 我在Windows 10 / IIS 10.0下,集成模式 我有一个。 net webform 4.7.2 网站,其中包含以下 nuget包: ImageResizer(v4.2.5) image...

1  system.web.mvc.modelstate没有IsValid的定义  ( System web mvc modelstate does not have a definition for isvalid ) 
在我的mvc 5应用程序中,我在我的 DeleteConfirmed中有一个试用块 actionResult,它运作良好。这样我不重复代码,我试图将下列代码块的指示部分放入控制器外的函数。我将函数添加到自定义 ErrorLog 类,但是当我确实时,智能issense表示"system.web.mvc.modelsta...

0  ASP.NET MVC使用时间间隔  ( Asp net mvc working with time intervals ) 
我要做的是: 我有一个项目经理列表(每个元素都有 998887664 和 TillDate 属性,它表示他或她在所选项目上工作时的工作。我需要编写一个将新的项目管理器添加到列表中的方法,并确保项目经理工作日期不会与例如相交。: Manager1 01.01.2000 - 01.01.2010 Manager2 ...

1  编程地在AppDomain中重新加载组装的效果  ( Effect of reloading assembly programatically in appdomain ) 
假设我有ASP.NET Web应用程序,其中特定装配和类型中的类型已加载在AppDomain中。如果使用来自system.reflection命名空间的汇编载荷()方法再次编辑地加载相同的程序集。然后,它将在应用程序的上遇到副作用 性能 内存消耗 ...

0  将数据设置为Excelsheet  ( Exporting data set to excelsheet ) 
我是新的,以便在c#中excel自动化,所以我对此感到困惑。我在数据集中导入了Excel,并且根据我的要求,我在数据集中完成了一些更新。现在我想将该数据集导出到该输入表,以便我可以在数据表中反映的数据集中看到的更新。将数据集导出到Excel的最佳方法是什么。 以下是我如何打开Excel表的代码: cons...

0  如何处理ADO.NET DBConnection与DBDataAdapters的长期运行Web服务?  ( How to handle ado net dbconnections in long running web service with dbdataada ) 
基本上我现在所做的是: 在初始化期间 创建连接并存储它 使用存储的连接创建dbdataAdapters及其命令 调用dbdataAdapter.fill for the 适配器从数据库填充DataTables 以及处理请求 在DataTables 中的插入/更新/删除行 在某个点调用dbdataAdapter...

0  除IIS服务器外,CSS在其他PC Web浏览器中呈现不同的方式  ( Css renders differently in other pc web browsers except in iis server ) 
我已经修改了CSS文件[ASP.NET/VS 2008]并托管到IIS服务器(Windows Server 2003 - IIS 6)。首先没有正确呈现。因此,我替换IIS服务器内的CSS文件并托管项目。然后它只在IIS服务器上正确呈现(浏览它时)。但不是在其他PC浏览器上呈现。我怎么解决这个问题? ...

4  如何确定移动设备C#中屏幕的方向?  ( How to determine the orientation of the screen in c sharp for mobile devices ) 
如何在c#-application中知道,其中移动设备的屏幕定向方向? (即水平或垂直)。 ...

0  protobuff serialise system.numerics.biginteger  ( Protobuff serialise system numerics biginteger ) 
代码: [ProtoMember(11002)] public BigInteger StartInteger { get; private set; } 抛出异常: No serializer defined for type: System.Numerics.BigInteger 如何制作 S...

33  无法隐式地将“system.lind.iqueryable <int>”转换为'int?'  ( Cannot implicitly convert type system linq iqueryableint to int ) 
var cityList = from country in doc.Element("result") .Element("cities") .Descendants("city") sel...

1  emgu cv,tessdata - 无法加载pol语言  ( Emgu cv tessdata cant load pol language ) 
我已经用语言下载了Emgucv v4.2.0和tessdata文件夹并将此文件夹粘贴到bin文件夹中。在Tessdata文件夹中,我也有很多语言,ENG和POL。 在c#中我有这样的代码: using (ImageParser ip = new ImageParser(@"C:Emguemgucv-windes...

0  将C#数据结构传递给JavaScript  ( Passing c sharp data structure to javascript ) 
这是我的javascript,下面是我的c#代码: //javascript in view var data = { labels: [@Misc.printData(Model.chartLabels, true)], datasets: [ ...

0  从下拉列表中的值拆分文本和整数  ( Splitting text and integer from values in a drop down list ) 
我有一个下拉列表,其中值: 狗 - 100英镑 猫 - £30 等 我正在尝试拆分字符串"狗" 和金额"£100" ,并在访问数据库中的其他字段中存储每个字段。 我知道使用if语句做的方式,但是有没有做到这一点? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.