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