使用EventArgs取消.NET中的事件的模式

时间:2012-11-29 07:33:07

标签: .net wpf events design-patterns user-interface

在.NET中,通常会有一种模式使用属性来使用事件来取消事件。例如,示例here

    private void OtherInitialize() {
       this.Closing += new CancelEventHandler(this.Form1_Closing);
    }

    private void Form1_Closing(Object sender, CancelEventArgs e) {
       if (!isDataSaved) {
          e.Cancel = true;
          MessageBox.Show("You must save first.");
       }
       else {
          e.Cancel = false;
          MessageBox.Show("Goodbye.");
       }
    }

是否有此模式的名称,或描述如何实现此模式的任何文章(从视图的角度来看)?我能想象的是这样的事情

CancelEventArgs args = new CancelEventArgs();
if(Closing != null)
    Closing(this, args);
if(!args.Cancel)
    DoActualClosing();

但我不确定这是否容易。如果有多个事件处理程序,哪个处理程序将确定args.Cancel的最终值怎么办?如果任何(或所有)处理程序抛出异常怎么办?

1 个答案:

答案 0 :(得分:0)

  

如果有多个事件处理程序,哪个处理程序将确定args.Cancel的最终值怎么办?

依次调用每个处理程序,并可以修改args.Cancel。

目前它们按照添加顺序执行,但我相信这是一个无法保证的实现细节。

所以,最后一个获胜。通常,Cancel事件处理程序只设置arg.Cancel = true(从不将其重置为false),以便任何事件处理程序都可以取消该操作。但没有什么可以阻止事件处理程序忽略该约定。

  

如果任何(或所有)处理程序抛出异常怎么办?

然后,除非你处理它,否则你的应用程序会因未处理的异常而崩溃。

您想象的实现看起来是正确的(它不是线程安全的,但UI事件通常只在UI线程上处理)。我不知道这种模式的名称。