【问题标题】:Prepare dependency property for invalid value为无效值准备依赖属性
【发布时间】:2017-03-11 14:57:03
【问题描述】:

我创建了UserControl,它提供了很少的dependency properties。其中之一的值为int。现在用户提供了null 作为值并且抛出了异常:

System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='<null>' ...

这是一个有效的行为(我相信是 WPF?)。但是我想为此类事件准备我的UserControl。我的意思是,如果绑定提供了无效值,我想捕获它并提供我的默认值,所以不会抛出异常。

如何做到这一点?我试过 DependencyPropertyChangedCallbackCoerceValueCallbackValidateValueCallback 回调,但似乎它们都没有收到这个值。

【问题讨论】:

  • 您的 UserControl 无法对此做出反应,因为错误出现在 Binding 中。

标签: c# wpf dependency-properties


【解决方案1】:

您不能将int 属性设置为int 值以外的任何其他值,因此UserControl 中的依赖属性实际上永远不会被调用,UserControl 对此无能为力该属性永远不会被设置。

包括UserControl 在内的任何类的使用者都有责任将属性设置为属性类型的值。

在这种情况下,当 WPF 运行时尝试将您的 int 属性设置为不代表有效整数的值(例如 null)时会发生错误。

你可以做的是在价值转换发生之前使用ValidationRule做一些事情,如果转换失败,则会向用户显示错误消息:

How do I handle DependencyProperty overflow situations?

另一个选项可能是将依赖属性的类型更改为Nullable<int> (int?)。然后您将能够将其设置为任何有效的整数值以及null

【讨论】:

    【解决方案2】:

    在绑定到该 DependencyProperty 的绑定中,您可以设置 NullValue 和 FallbackValue。 有点像。

     <TextBlock  Text="{Binding SomeProperty, FallbackValue='Null not suported', TargetNullValue={x:Null}}"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2012-06-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多