WPF - 如何从视图而不是视图模型显示自定义异常

Posted

技术标签:

【中文标题】WPF - 如何从视图而不是视图模型显示自定义异常【英文标题】:WPF - How to display the cutom exception from view insted of viewmodel 【发布时间】:2013-04-16 06:15:48 【问题描述】:

我有一个 WPF MMVM 应用程序,我们正在从 viewmodel 方法获取 xml 解析器异常。但问题是我不想从视图模型中显示异常。我想从视图显示消息(CustomMessageBox.Show() 从视图调用)

根据下面的代码,我从视图模型 catch 块中调用 CustomMessageBox.Show()。 如何从xaml.csxaml 呼叫CustomMessageBox.Show()

我们如何通知视图并调用CustomMessageBox.Showfrom视图?此代码 sn-p 在 WPF 命令中调用。

当前实现:

try

  var xamlReader = XamlReader.Parse(xamlText);
  var gb = modelTemplate.GetGraphicalObject("Icons");
  var strings = new Dictionary<string, string>   "Default", xamlText  ;
  gb.UpdateGraphicalObject(strings, null, null);
  if (xamlReader != null)
  
    var view = new Viewbox();
    view.Child = (UIElement)xamlReader;
    view.Stretch = Stretch.Uniform;
    modelVM.Icon = view;
    
  
  catch (XamlParseException)
  
    CustomMessageBox.Show("Invalid XAML file specified.", Properties.Resources.NextGenSim, MessageBoxButton.OK, MessageBoxImage.Error);
    //throw new XamlParseException("Invalid XAML file specified");
  

【问题讨论】:

@wizzardz 您的编辑没有添加任何实质性内容,帖子很好。你所做的只是搞砸了缩进。回滚。 也许您可以在抛出异常时在您的 ViewModel 中设置一个属性,并在您的 View 本身中绑定到该属性。 你的 MVVM 实现是否包含某种Messenger 类? 我想从视图模型的视图调用 CustomMessageBox.Show。已实现自定义消息框 --> 自定义消息框:窗口。我如何通知 viewmodel wxception 来查看?我们没有实现任何 Messenger 类 【参考方案1】:

如果您使用信使/事件聚合器(例如 MVVM Light),您可以将包含异常详细信息的消息从视图模型发送到视图,当收到该消息时,可以触发消息框显示。

使用MVVM Light,它可能如下所示:

视图模型:

Messenger.Default.Send(new ErrorMessage("Invalid XAML file specified.",
                       Properties.Resources.NextGenSim));

查看

Messenger.Default.Register<ErrorMessage>(this, message =>
    
        CustomMessageBox.Show(message.Message, message.Details, 
                              MessageBoxButton.OK, MessageBoxImage.Error);
    

ErrorMessage 是一个自定义类,包含您需要向用户显示的有关异常的任何详细信息。

【讨论】:

我能知道我们如何通过事件聚合器实现这一点吗? 我知道我们可以通过事件聚合器实现上述目标吗? 如果你没有使用像 Prism 或 Caliburn Micro 这样的框架,这里有一个名为Roll Your Own Simple Message Bus / Event Aggregator的帖子【参考方案2】:

您可以使用ValueConverter 创建一个模态Popup 与ViewModel 属性ErrorMessage 的可见性绑定,该ValueConverter 在给定的源不为null 或为空时返回true。

【讨论】:

以上是关于WPF - 如何从视图而不是视图模型显示自定义异常的主要内容,如果未能解决你的问题,请参考以下文章

如何判断 UITabBar 是不是从自定义视图打开?

如何从视图模型中关闭 Catel 框架数据窗口

如何让自定义视图观察包含片段的生命周期事件而不是活动?

WPF Prism 将参数从 idialog 发送回视图

从视图模型 (WPF) 调用视图中的动画

如何从作为wpf mvvm模式中的窗口打开的视图模型中关闭用户控件?