WPF PasswordBox中的错误处理

WPF PasswordBox中的错误处理,wpf,mvvm,passwordbox,custom-error-handling,Wpf,Mvvm,Passwordbox,Custom Error Handling,我一直很钦佩乔希·史密斯的建树之道。 我还尝试模拟他的应用程序的ViewModels实现IDataErrorInfo属性的方式,并通过自定义DataTemplate在用户之前呈现错误。 以下是他用来显示错误的数据模板: <DataTemplate DataType="{x:Type ValidationError}"> <TextBlock FontSize="10" FontStyle="Ital

我一直很钦佩乔希·史密斯的建树之道。 我还尝试模拟他的应用程序的ViewModels实现IDataErrorInfo属性的方式,并通过自定义DataTemplate在用户之前呈现错误。 以下是他用来显示错误的数据模板:

<DataTemplate DataType="{x:Type ValidationError}">
  <TextBlock FontSize="10"
             FontStyle="Italic"
             Foreground="Red"
             HorizontalAlignment="Right"
             Margin="0,1"
             Text="{Binding Path=ErrorContent}"/>
</DataTemplate>

我确信,之所以会出现这个问题,是因为Password属性已经被helper类扩展了。如果我放弃这种方法,我将不得不从IDataErrorInfo实现中删除Password属性,并在登录按钮上单击以验证它,并向用户显示一个消息框。但也不能不牺牲一致性。我不太了解依赖属性;有什么解决办法吗?以某种方式更改helper类是否会使红色错误消息恢复原位?

不确定这是否是您的问题,但您没有关闭
密码箱的默认错误模板。(即no
Validation.ErrorTemplate=“{x:Null}


编辑:您是否可以使用类似的方法来检查
密码箱的
验证内容。错误
,以确保错误确实存在(甚至只是将ItemsControl绑定到它)?

不确定这是否是您的问题,但您没有关闭
密码箱
的默认错误模板。(即no
Validation.ErrorTemplate=“{x:Null}


编辑:您可以使用类似的方法来检查
密码框
验证.错误
的内容,以确保错误确实存在(甚至只是将ItemsControl绑定到它)?

我在您的密码绑定中没有看到
validatesOnDaerRors=True
,因此这可能是您的问题。默认情况下,该值设置为
False
,这意味着绑定不会向UI发出任何验证错误的警报


这就是说,我认为
密码
不是一个
依赖属性
,因为您确实不应该将密码存储为纯文本

通常我会传递
密码箱。密码
(或整个
密码箱
)作为my
LoginCommand
CommandParameter
,它可以获取数据并对其执行任何操作。通常这意味着对其进行散列或其他操作,并将其与存储的密码散列进行比较,以查看其是否相同。如果登录失败,我会将相关错误消息写入ViewModel中的属性,该属性绑定到登录用户界面

<Button Command="{Binding LoginCommand}" 
        CommandParameter="{Binding ElementName=MyPasswordBox, Path=Password}" />

我在您的密码绑定中没有看到
validatesOnDaerRors=True
,因此这可能是您的问题。默认情况下,该值设置为
False
,这意味着绑定不会提醒UI任何验证错误


这就是说,我认为
密码
不是一个
依赖属性
,因为您确实不应该将密码存储为纯文本

通常我会传递
密码箱。密码
(或整个
密码箱
)作为my
LoginCommand
CommandParameter
,它可以获取数据并对其执行任何操作。通常这意味着对其进行散列或其他操作,并将其与存储的密码散列进行比较,以查看其是否相同。如果登录失败,我会将相关错误消息写入ViewModel中的属性,该属性绑定到登录用户界面

<Button Command="{Binding LoginCommand}" 
        CommandParameter="{Binding ElementName=MyPasswordBox, Path=Password}" />


感谢您标记该错误,但这不会是问题所在。因为不关闭默认错误模板会使默认错误模板出现。但不会出现任何内容。感谢您标记该错误模板,但这不会是问题所在。因为不关闭默认错误模板会使默认错误模板出现r、 但是什么都没有出现。谢谢你的回复。在我开始使用这个设计之前,我有这个选项。在我的情况下,登录模块更像是一个正式的设计,以保留传统的方法。我的问题不是设计,我可以用另一种方式将密码传递给ViewModel。我的问题是PasswordBoxAssistant是如何阻止的g防止密码被验证。@James您是否在密码绑定中设置了
validatesOnDaerRors=“True”
?也就是说,我在密码绑定中没有看到validatesOnDaerRors=True,所以这可能是您的问题@Rachel有个陷阱。谢谢你指出这一点。我很不好意思把我的作业扔给你。我们能不能停止这种“不在内存中存储密码”的做法业务?盒子的密码属性首先是一个字符串。所以这只是cargo cult,因为该死的字符串已经存在于内存中,很容易用snoop!@flq读取。这是真的,但是我认为
密码盒。密码是由用户键入的,并且只作为应用程序的一部分存在于盒子的生命周期中
PasswordBox
对象,而类似于
User.Password
的东西会在
User
对象的生命周期内存在,并且会在内存中停留更长的时间。感谢您的回复。在我开始使用此设计之前,我有过此选项。在我的情况下,登录模块更像是一种正式的设计,以保留传统的方法h、 我的问题不是设计,我可以用另一种方式将密码传递给ViewModel。我的问题是PasswordBoxAssistant如何阻止密码被验证。@James您是否在密码绑定中设置了
validatesOnDaerRors=“True”
?“也就是说,我在你的密码绑定中看不到validateSondaerRors=True,所以这可能是你的问题。”@Rachel有问题。谢谢你指出这一点。我很不好意思把作业扔给你。我们能不能停止这种“不在内存中存储密码”的做法“业务?盒子的密码属性首先是一个字符串。所以这只是cargo cult,因为该死的字符串已经在内存中,很容易用snoop!@flq读取。这是真的,但是我认为
xmlns:ff="clr-namespace:MyProject.UserViews"
<Button Command="{Binding LoginCommand}" 
        CommandParameter="{Binding ElementName=MyPasswordBox, Path=Password}" />