2012-01-07 47 views
0

我正在开发Silverlight LOB应用程序。 由于一些必需的功能,我为所有页面创建了一个新的NewBasePage类。这个类是从Page类派生的。我已经添加了几个事件并手动提高它们。检查所有连接的方法是否成功完成

但我坚持一些东西。我需要检查绑定到某个事件的所有方法是否都成功完成。有没有办法做到这一点?

新的基类:

public class NewPageBase : Page 
{ 
     public void RefreshData(Action resultAction = null) 
     { 
      if (StartRefreshingData != null) StartRefreshingData(this, null); 

      if (resultAction != null) resultAction(); 
     } 

     public event EventHandler StartRefreshingData; 

} 

的XAML:

<newbase:NewBasePage ...> 

... 

    <i:Interraction.Triggers> 
    <i:EventTrigger EventName="StartRefreshingData"> 
     <i:InvokeCommandAction Command="{StaticResource someCommandFromViewModel}"/> 
    </i:EventTrigger> 
    </i:Interraction.Triggers> 
</newbase:NewBasePage> 
+0

据我所知,事件被同步调用,也就是说,当调用事件后的代码被调用时,所有附加事件处理程序的执行完成(显然不包括由它们启动的线程)。 – Nuffin 2012-01-07 14:10:54

+0

托比亚斯是对的,事件同步运行。通过了解事件处理程序成功完成,你试图完成什么? – 2012-01-07 14:30:15

+0

@ M.Babcock我正在提高'OnPageChanging'事件,如果附加的事件处理程序失败(我宁愿不抛出异常) - 那么我不会改变当前页面。 – 2012-01-07 15:52:59

回答

1

如果你想知道,如果任何事件处理程序没有做他的工作,你可以抛出一个异常,或提供自定义的EventArgs跟踪任何事件处理程序失败的类型。

public class FailureEventArgs : EventArgs // not the best name, I know 
{ 
    private bool _failed; 

    public bool Failed 
    { 
     get { return _failed; } 
     set { _failed |= value; } 
    } 
} 

用法:

// Event declaration 
public event EventHandler<FailureEventArgs> MyFailingEvent; 

// Event invocation 
private void Invoke() 
{ 
    bool failure = false; 
    var handler = MyFailingEvent; 
    if (handler != null) 
    { 
     var args = new FailureEventArgs(); 
     handler(this, args); 
     failure = args.Failed; 
    } 

    // more code, aware of possible failure 
} 

// In your event handler 
private void OnEvent(object sender, FailureEventArgs args) 
{ 
    var errorOccured = false; 

    // some code which could set errorOccured to true 

    args.Failure = errorOccured; 
} 

而且,正如已经在上面我的评论中提到,一旦事件invokation结束了,你可以肯定的是没有了处理没有附加事件处理程序。

+0

感谢您的回答。但我不确定,我如何检查绑定的所有方法(在XAML中使用'EventTrigger'和'InvokeCommandAction')是否返回true(仅举例)。 – 2012-01-08 22:08:29