【问题标题】:WPF simple binding validation, using red bordersWPF 简单绑定验证,使用红色边框
【发布时间】:2011-09-01 17:05:00
【问题描述】:

不知道红色验证边框的术语,有吗?

我有一个继承自IDataErrorInfo的视图模型。它将一个 int 属性绑定到一个“数量”文本框,因此当输入字母字符时,它会获得一个红色的验证边框。这是完美的行为。该红色边框由操作系统设置样式,因此很合适。它不需要我继承或实现 IDataErrorInfo;它既简单又自动。

有没有办法让绑定到字符串的 texbox 获得相同的行为,当字符串为空(或开始为空)时变为红色。我知道我可以将它们绑定到一个继承自 IDataErrorInfo 的对象来执行此操作,但我想知道是否存在像上述那样简单的解决方案。

我认为当您输入字母字符时,对数量的 int 绑定会在 setter 中引发异常。如果您将值更改为空,则在字符串的 setter 中执行相同操作,但如果它开始为空则不是红色(因为尚未调用 setter),并且 setter 导致 Visual Studio 跳入首先是调试器,数量字段不这样做。

这可能吗,还是 int 验证只是一个幸运的例外?

编辑:除非您在使用 tabcontrol 的界面上工作,否则 HB 的以下解决方案可以完美运行。有关详细说明,请参阅此SO question,但这里有一个简短的说明:验证错误绘制在切换选项卡时丢弃的图层上。有一个简单的解决方案,除非您的验证错误在当前未选中的选项卡上的控件上引发。突然间,解决方案变得非常复杂,而且在我看来,非常hacky。

编辑:我认为数据触发器可能是处理此问题的最简单方法,而且它也易于重复使用。

<Style x:Key="TextBoxEmptyError" TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text.Length}" Value="0">
            <Setter Property="BorderBrush" Value="{StaticResource ResourceKey=SemiTransparentRedBrushKey}"/>
            <Setter Property="BorderThickness" Value="2" />
        </DataTrigger>
    </Style.Triggers>
</Style>

【问题讨论】:

  • 红色边框是ErrorTemplate的一个实例,不知道除此之外是否还有合适的术语......

标签: wpf validation binding


【解决方案1】:

您可以将ValidationRule 添加到文本绑定中,这会在输入空字符串时出错,以使其立即生效,将ValidatesOnTargetUpdated 设置为true。

【讨论】:

  • 这看起来很有希望。我认为这可能是验证规则的更好链接:msdn.microsoft.com/en-us/library/ms753962.aspx
  • @HB 这是一个子问题,但是否可以绑定到验证规则?例如将某些解释的可见性绑定到validation=true?
  • @Tyrsius:您需要在规则上有一些属性,然后可以包含从 DependencyObject 继承的类的实例,规则本身不能具有依赖属性,因为它不继承自该类,因此不支持绑定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多