我的视图模型类有一个连接到服务的方法(不确定这是不错的做法,还是视图模型应该是严格的属性和属性更改机制)。当然,我想在连接或断开连接时处理任何可能的WCF异常。
让我们使用未找到的端点作为示例,因为这是一个我想引起用户注意的异常。考虑粗略的代码示例:
public void Connect()
{
ServiceClient proxy = null;
try
{
proxy = new ServiceClient();
proxy.Subscribe();
// ...
}
catch(EndpointNotFoundException)
{
// should I do something here?
}
// .. other WCF related exception catches and a finally
}
是否可以直接在catch中调用System.Windows.MessageBox.Show()或者我是否应该重新抛出异常,以便我的WPF应用程序的另一层捕获它?如果是这样,那么理想的地方可以捕获这样的例外吗?
答案 0 :(得分:33)
我一直在处理我的MVVM客户端中的异常,通过捕获它们并将它们包装在ErrorViewModel
属性中ViewModel
捕获异常。
假设ViewModel A 捕获EndpointNotFoundException。为了呈现此错误,我将Exception包装在ErrorViewModel中并将其分配给 A 的Error属性。
与 A 关联的视图包含绑定到 A 的错误属性的ContentControl
。同时,我使用DataTemplate
将错误视图与ErrorViewModel相关联。在该视图中,Visibility
取决于 A 的错误属性是否包含异常。
所以 A 的视图包含一个错误消息视图,该视图仅在捕获到异常时出现,并且可以被用户解除(错误消息View上的OK按钮调用 A 上的命令清除 A 的错误属性,从而将错误消息View的可见性更改为Collapsed
。
到目前为止,这似乎是一种保留适当的MVVM解耦的好方法。
希望有所帮助。不管怎样,老实说,我认为WPF应用程序中的System.Windows.MessageBox.Show()
纯粹是最后的手段。为什么放弃对UI的丰富控制以支持旧的东西?说到这里,这里是another popup-implementation approach。