在.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的最终值怎么办?如果任何(或所有)处理程序抛出异常怎么办?
答案 0 :(得分:0)
如果有多个事件处理程序,哪个处理程序将确定args.Cancel的最终值怎么办?
依次调用每个处理程序,并可以修改args.Cancel。
目前它们按照添加顺序执行,但我相信这是一个无法保证的实现细节。
所以,最后一个获胜。通常,Cancel事件处理程序只设置arg.Cancel = true(从不将其重置为false),以便任何事件处理程序都可以取消该操作。但没有什么可以阻止事件处理程序忽略该约定。
如果任何(或所有)处理程序抛出异常怎么办?
然后,除非你处理它,否则你的应用程序会因未处理的异常而崩溃。
您想象的实现看起来是正确的(它不是线程安全的,但UI事件通常只在UI线程上处理)。我不知道这种模式的名称。