我正在开发一个WPF应用程序,我的目标是.NET Framework 4
我有一个TextBox绑定到Email属性,绑定有ValidatesOnException=True
来捕获设置Email属性时可能发生的任何异常。
如果当前委托人不在角色" edit-person"中,我的电子邮件属性会抛出安全例外。
当抛出安全性异常时,应用程序崩溃而不是以红色突出显示电子邮件TextBox。
这是我对TextBox的XAML绑定:
<TextBox Text="{Binding Path=Email, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
这是我的电子邮件属性代码:
Public Property Email As String
Get
Return return _email
End Get
Set(value As String)
If Not Thread.CurrentPrincipal.IsInRole("Edit-Person") Then Throw New Security.SecurityException("You are not permitted to edit the email address")
_email = value
End Set
End Property
如果我抛出ValidationException
或ArgumentException
绑定捕获异常,应用程序不会崩溃。它似乎只是SecurityException
的一个问题。
根据Binding.ValidatesOnException Property的MSDN文档,我无法理解为什么这不起作用。
实现IDataErrorInfo接口对我来说不是一个选项。
我真的可以在这里使用一些建议。
修改 我创建了一个新的测试项目,以确保在我使用的那个项目中发生了一些奇怪的事情并找到了相同的结果。
我创建了一个名为WPFSecurityException的测试WFP项目,并从MSDN文档中复制粘贴了ValidationException属性的示例...并修改了抛出的异常为SecurityExcpetion。
例如,这是我的测试WPF项目的MainWindow的XAML:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:WPFSecurityExceptionTest"
Title="MainWindow" Height="350" Width="525">
<StackPanel Margin="20">
<StackPanel.Resources>
<src:PersonThrowException x:Key="data"/>
<!--The tool tip for the TextBox to display the validation error message.-->
<Style x:Key="textBoxInError" TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock>Enter your age:</TextBlock>
<TextBox Style="{StaticResource textBoxInError}">
<TextBox.Text>
<!--By setting ValidatesOnExceptions to True, it checks for exceptions
that are thrown during the update of the source property.
An alternative syntax is to add <ExceptionValidationRule/> within
the <Binding.ValidationRules> section.-->
<Binding Path="Age" Source="{StaticResource data}"
ValidatesOnExceptions="True"
UpdateSourceTrigger="PropertyChanged"
>
</Binding>
</TextBox.Text>
</TextBox>
<TextBlock>Mouse-over to see the validation error message.</TextBlock>
</StackPanel>
</Window>
以下是窗口的VB.NET代码和自定义PersonThrowException类:
Class MainWindow
End Class
Public Class PersonThrowException
Private m_age As Integer
Public Property Age() As Integer
Get
Return m_age
End Get
Set(ByVal value As Integer)
If value < 0 OrElse value > 150 Then
Throw New Security.SecurityException("Age must not be less than 0 or greater than 150.")
End If
m_age = value
End Set
End Property
End Class
答案 0 :(得分:0)
您是否尝试在发布模式下构建代码并从Visual Studio外部运行可执行文件?
从答案到另一个问题:https://stackoverflow.com/a/5510097/4456875
解决方案不是那么明显,也没有很好的文档记录,但足够简单。 Visual Studio在调试模式下运行时中断异常的原因是因为它以这种方式配置
您可以在Debug-&gt; Exceptions菜单中配置此行为,或者只运行可执行文件