【问题标题】:Source -> Target Binding Validation (WPF)源 -> 目标绑定验证 (WPF)
【发布时间】:2011-10-27 12:29:13
【问题描述】:

如果我有一个 WPF 控件绑定到数据源并在 Binding 对象上将 ValidatesOnExceptions 设置为 true。现在,如果我在控件中写入无法转换为源数据类型的内容,我将收到验证错误并在控件上显示红色边框。

但是如果我在源上设置了不兼容的值,异常会在绑定中静默捕获并返回默认值。由于绑定错误,没有迹象表明控件中的值不可信。

我如何将绑定问题可视化给用户,无论是哪一方造成的?我想让用户知道控件中的值是不可靠的。

更多信息:

这就是我在跟踪中的内容。它告诉我在转换过程中抛出了 OverflowException(因为 99999 不适合 Int16)。然后在目标上设置值时,它只是使用 0 而不是 99999。没关系,我不指望它会做不可能的事情。问题是它没有给我一个选项来处理错误并且没有发现验证错误。

从 DataClass 获得 PropertyChanged 事件 (hash=2616333)
使用 RuntimePropertyInfo(Int32) 从 DataClass (hash=2616333) 获取级别 0 的值:'99999'
TransferValue - 得到原始值“99999”
mscorlib.dll 中出现了“System.OverflowException”类型的第一次机会异常 System.Windows.Data 错误:6:“SystemConvertConverter”转换器无法转换值“99999”(类型“Int32”);如果可用,将使用后备值。绑定表达式:路径=Int32; DataItem='DataClass' (HashCode=2616333);目标元素是'AliasClass' (HashCode=32866918);目标属性是“Int16”(类型“Int16”)OverflowException:“System.OverflowException:对于 Int16,值太大或太小。
TransferValue - 隐式转换器产生 {DependencyProperty.UnsetValue}
TransferValue - 使用后备/默认值“0”
TransferValue - 使用最终值'0'

【问题讨论】:

  • 根据 WPF 4 Unleashed 一书,验证仅在将数据从目标推送到源时有效,反之则无效。

标签: wpf validation binding


【解决方案1】:

为了可视化绑定问题,我知道有两种方法:

1) 创建一个只返回值的 IValueConverter,并检查该值。
这对于确保传递的变量是您想要的变量特别有用。
它是这样的:

 public class BindingTestConverter : IValueConverter, IMultiValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion

        #region IMultiValueConverter Members

        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return values;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }

2) 利用 PresentationTraceSource:

<UserControl (...) PresentationTraceSources.TraceLevel="High" (...) />

这将在 Visual Studio 的“输出窗口”中显示您视图中的绑定错误。

【讨论】:

  • PresentationTraceSources.TraceLevel 是查找绑定问题的好方法,但我知道绑定问题是什么(转换错误)。我想允许错误(我不希望应用程序崩溃)。我还想让用户非常清楚他正在查看的值有问题。
  • 随着您的最新添加,您的问题似乎是 99999 不适合 Int16
  • 我知道。相信我,我知道。但我也希望用户知道。并不是说 99999 对于 Int16 来说太大了,而是 0 不是真正的值,不能被信任。
  • 您可以在转换器中捕获异常并在这种情况下返回 -1。然后更新您的验证规则,以便将 -1 视为错误。
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多