如何处理UWP App中生成的XAML代码抛出的ArgumentException

时间:2017-09-07 12:17:17

标签: c# xaml exception-handling uwp

我的UWP应用程序中有几个文本框绑定到浮动属性(双向)。我使用编译绑定。在这个时候,没有自己的"代码隐藏"对于这些文本框。现在我遇到了应用程序在简单的错误拼写上崩溃的问题(例如,如果用户键入字母而不是数字)。我想知道如何在不修改生成的代码的情况下处理这些异常。

<TextBox Text="{x:Bind ViewModel.QtyGoodEntered, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="1" FontSize="36" x:Name="QtyGoodTextBox"/>

当尝试将字母转换为浮动时,应用程序崩溃。

 case 33: // Views\ProdFeedbackView.xaml line 191
this.obj33 = (global::Windows.UI.Xaml.Controls.TextBox)target;
                        (this.obj33).LostFocus += (global::System.Object sender, global::Windows.UI.Xaml.RoutedEventArgs e) =>
{
  if (this.initialized)
  {
    // Update Two Way binding
    this.dataRoot.ViewModel.QtyGoodEntered = (global::System.Double) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Double), this.obj33.Text);
  }

此致 尼尔斯

1 个答案:

答案 0 :(得分:0)

好的,我有以下选择。

  • 使用转换器(感谢Florian Moser)
  • TextBoxMask Property(感谢Marian Dolinsky)
  • 捕获UnhandledException

由于时间不够,我坚持使用转换器解决方案,但我认为TextBoxMask属性值得一试。在我看来,捕获UnhandledException是最糟糕的解决方案。 这就是我的转换器的样子。如果发生异常,则内容默认为0.0。这就是我所需要的一切。

    public class StringToDoubleConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            try
            {
                return System.Convert.ToString((double)value);
            }
            catch
            {
                return "";
            }

        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            try
            {
            return System.Convert.ToDouble((string)value);
            }
            catch
            {
                return 0.0;
            }
        }
    }

那就是XAML部分

<TextBox Text="{x:Bind ViewModel.QtyGoodEntered, Mode=TwoWay, Converter={StaticResource StringToDoubleConverter}}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="1" FontSize="36" x:Name="QtyGoodTextBox"/>