WPF绑定ValidatesOnException未捕获SecurityException

时间:2014-04-09 15:57:49

标签: .net wpf validation xaml binding

我正在开发一个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

如果我抛出ValidationExceptionArgumentException绑定捕获异常,应用程序不会崩溃。它似乎只是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

1 个答案:

答案 0 :(得分:0)

您是否尝试在发布模式下构建代码并从Visual Studio外部运行可执行文件?

从答案到另一个问题:https://stackoverflow.com/a/5510097/4456875

  

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

您可以在Debug-&gt; Exceptions菜单中配置此行为,或者只运行可执行文件