C# 文本框验证异常行为

C# 文本框验证异常行为,c#,wpf,validation,xaml,C#,Wpf,Validation,Xaml,我在.NET3.5中使用c#实现了WPF应用程序。 目前应用程序正在使用大量代码隐藏方法,它是在我开始工作之前开发的,我想删除所有代码隐藏方法,并对文本框使用WPF验证。当前验证发生在控件失去焦点时,即 private void Control_LostFocus(object sender, RoutedEventArgs e) 现在我在验证时遵循了这一点,在我的应用程序中实现了验证之后,我得到了以下结果: 正如您所看到的,验证并没有拾取文本框的更改,但当我尝试此操作时: 验证是成功的。 我

我在.NET3.5中使用c#实现了WPF应用程序。
目前应用程序正在使用大量代码隐藏方法,它是在我开始工作之前开发的,我想删除所有代码隐藏方法,并对文本框使用WPF验证。当前验证发生在控件失去焦点时,即

private void Control_LostFocus(object sender, RoutedEventArgs e)
现在我在验证时遵循了这一点,在我的应用程序中实现了验证之后,我得到了以下结果:
正如您所看到的,验证并没有拾取文本框的更改,但当我尝试此操作时:
验证是成功的。
我这样做也是成功的:
不知道为什么这是有效的?
以下是我的文本框的xaml:

<TextBox
    MaxLength="20"
    VerticalAlignment="Top" 
    VerticalContentAlignment="Center" 
    Width="120" Template="{DynamicResource TextBoxControlTemplate}" TabIndex="6" >
    <TextBox.Text>
       <Binding Path="Order.HirerName" UpdateSourceTrigger="PropertyChanged">
           <Binding.ValidationRules>
               <ExceptionValidationRule/>
           </Binding.ValidationRules>
       </Binding>
    </TextBox.Text>
<!-- OLD VALIDATION METHODS -->
<!--GotFocus="Control_GotFocus"
    KeyUp="Control_KeyUp"
    LostFocus="Control_LostFocus"-->
<TextBox.BorderBrush>
    <SolidColorBrush Color="Green"/>
</TextBox.BorderBrush>
</TextBox>  
编辑2:
以下是情况的屏幕截图:

无输入,字段无效

字段应有效但验证失败:-(

控件失去焦点,发生验证!?
注:

当控制松开焦点时,顺序的字段再次被更新,即我在属性上设置断点,当控件失去焦点时,它被击中。

嗯,我仍然认为自己很年轻,但我不相信魔法。< /P> 至少在编程和计算机科学中是不行的。如果某件事发生了,那么它的发生只是因为有人让它发生了。你不可能白手起家

当您的属性为Int或DateTime时,viewmodel中不会出现异常—这应该从字符串转换而来

您的属性是String-绑定不可能失败并引发将要处理的异常,因为任何String属性都可以轻松绑定到任何String属性而无需任何转换

WPF不知道您对HirrName正确性的要求。因此它允许任何内容作为有效值传递给setter。这是您的属性,它应该对任何不正确的数据做出积极的反应

因此:

public字符串雇佣名称
{
获取{return\u hierrName;}
设置
{
if(String.IsNullOrEmpty(value)
抛出新ArgumentException(“Null或空”);
如果(值.长度<3)
抛出新的ArgumentException(“太短”);
如果(!string.Equals(_hilername,value,StringComparison.Ordinal))
{
_HirrName=值;
OnPropertyChanged(新PropertyChangedEventArgs(“HirrName”);
}
}
}
关于未处理的异常:

我忘记了一件事:WPF引擎处理异常(实际上是部分错误处理)ExceptionValidationRule可能会在调试模式下导致一些问题。独立版本应用程序中没有此类问题

由此:

解决方案不是很明显,也没有很好的文档记录,但足够简单。 Visual Studio在调试中运行时因异常而中断的原因 模式是因为它是这样配置的

在“调试”菜单中,选择“异常…”。在此对话框中,您可以控制 VS如何处理异常。只需取消选中“用户未处理”中的“通用” “语言运行时异常”,按“确定”,然后再次运行项目


注意:如果我记得有更好的方法来处理它,那么我会把它添加到这里。

如果你已经实现了UpdateSourceTrigger=“LostFocus”然后它会在焦点改变时更新,否则它会在属性改变上工作。你能显示你的订单吗。HirrName属性?因为我可以看到你的XAML没有问题。嗯,我对绿色边框有一些怀疑-它可能会扰乱默认装饰逻辑,但这不是我第一次看到的地方。@DhavalPatel是的,没错,它是wo设置
UpdateSourceTrigger=“LostFocus”
时会出错,但我的问题是为什么它在
UpdateSourceTrigger=“PropertyChanged”中不能正常工作
。在你的问题中它会看起来更好-使用编辑。@EugenePodskal完成。我从评论中删除了它,因为它很乱:/谢谢,我会尝试一下,然后返回给你。刚刚尝试过,它在初始化过程中抛出未处理的异常。不确定手动抛出异常是否是解决我问题的好方法,因为教程中的示例是cop正在与不同类型的验证触发器绑定。那么,您确定您的所有员工姓名都与属性中的当前规则一致吗?它们必须不为null,而不是空字符串,长度大于2。当我启动我的应用程序时,所有字段都为null,并且初始的
绑定
正在将
值设置为
null
,这是我的应用程序抛出异常的时候。由于应用程序无法加载UI,我还没有设置任何值。我已经删除了长度检查,因为它在我的情况下是不必要的。好吧,实际的示例肯定会在setter中抛出异常-if(String.IsNullOrEmpty(value)){throw new…}
public string HirerName
    {
        get { return _HirerName; }
        set
        {
            if (!string.Equals(_HirerName, value, StringComparison.Ordinal))
            {
                _HirerName = value;
                OnPropertyChanged(new PropertyChangedEventArgs("HirerName"));
            }
        }
    }
public string HirerName
    {
        get { return _HirerName; }
        set
        {
            if (String.IsNullOrEmpty(value)
                 throw new ArgumentException("Null or empty");

            if (value.Length < 3)
                 throw new ArgumentException("Too short");

            if (!string.Equals(_HirerName, value, StringComparison.Ordinal))
            {
                _HirerName = value;
                OnPropertyChanged(new PropertyChangedEventArgs("HirerName"));
            }
        }
    }