C# 如何验证密码箱WPF

C# 如何验证密码箱WPF,c#,wpf,validation,C#,Wpf,Validation,我正在尝试对密码箱进行验证。为了进行验证,我遵循了下面的步骤,它显示了如何在TextBox上进行验证 问题来自于密码箱。由于其密码由于安全原因无法绑定,因此我尝试进行以下绑定(也为CodeProject用户进行了解释) 所以,显然,太棒了!我可以用它的PasswordBox属性绑定我的PasswordBox,这样我就可以绑定我的验证了。但它忽略了我 这是一个我经常使用的文本框,工作正常: <local:ErrorProvider Grid.Column="1" Grid.Row="2" &

我正在尝试对
密码箱
进行验证。为了进行验证,我遵循了下面的步骤,它显示了如何在
TextBox
上进行验证

问题来自于
密码箱
。由于其
密码
由于安全原因无法绑定,因此我尝试进行以下绑定(也为CodeProject用户进行了解释)

所以,显然,太棒了!我可以用它的
PasswordBox
属性绑定我的
PasswordBox
,这样我就可以绑定我的验证了。但它忽略了我

这是一个我经常使用的
文本框
,工作正常:

<local:ErrorProvider Grid.Column="1" Grid.Row="2" >
    <TextBox Width="160" 
          HorizontalAlignment="Left" 
           Name="textBoxUserPass" 
           Text="{Binding Path=Password, UpdateSourceTrigger=Explicit}" />
 </local:ErrorProvider>
这就是如何为每个
文本框
获取
BindingExpression

BindingExpression beUserName = textBoxUserName.GetBindingExpression(TextBox.TextProperty);
if (beUserName != null) beUserName.UpdateSource();
BindingExpression bePassword = textBoxUserPass.GetBindingExpression(PasswordBoxAssistant.BoundPassword);
if (bePassword != null) bePassword.UpdateSource();
这就是我在
密码箱中获得密码的方式:

BindingExpression beUserName = textBoxUserName.GetBindingExpression(TextBox.TextProperty);
if (beUserName != null) beUserName.UpdateSource();
BindingExpression bePassword = textBoxUserPass.GetBindingExpression(PasswordBoxAssistant.BoundPassword);
if (bePassword != null) bePassword.UpdateSource();
如果我们犯了任何错误(在我的验证类中定义),当我这样做时:

if (!beUserName.HasError && !bePassword.HasError)

根据错误验证,每个
BindingExpression
应表示truefalse。但是对于我的
PasswordBox
永远不会得到值。。。有什么想法吗

据我所知,在密码箱上添加验证的唯一方法是在SecurePassword的binding属性的setter中抛出一个新的ValidationException。PasswordBoxAssistant将无法帮助您完成此操作。

请尝试在您的绑定上设置
validatesOnDaerRors=True
validatesOnceptions=True

<PasswordBox ...
   local:PasswordBoxAssistant.BoundPassword="{Binding Path=Password,
      UpdateSourceTrigger=Explicit, 
      ValidatesOnDataErrors=True, 
      ValidatesOnExceptions=True}"
/>

设置绑定模式=双向

local:PasswordBoxAssistant.BoundPassword="{Binding Path=Password,Mode=TwoWay,
UpdateSourceTrigger=Explicit}"

另一种解决方案,在中间不使用任何“不安全”的字符串,是为了适应窗口代码,类似于这样的:

<PasswordBox Name="MyPassword" PasswordChanged="MyPassword_Changed" ... />
假设我有一个这样的MVVM对象,使用以下方法进行WPF验证:

还有一个窗口Xaml,带有如下密码框:

<PasswordBox Name="MyPassword" PasswordChanged="MyPassword_Changed" ... />

您是否已尝试在绑定上设置
validatesOnDaerRors=True
validatesOnceptions=True
?它不存在于
PasswordBox
…它存在于
BoundPassword
附加属性:
local:PasswordBoxAssistant.BoundPassword=”{Binding Path=Password,UpdateSourceTrigger=Explicit,validatesondaerros=True,validatesonceptions=True}”
每个人似乎都在使用的PasswordBoxAssistant在哪里?PasswordBoxAssistant:哼哼,你能提供一个示例或链接吗?听起来像是一个解决方案。这是我在一个旧应用程序中发现的:public SecureString NewPassword{get{return_NewPassword;}设置{u newPassword=value;string error=IsPasswordValid();if(!string.IsNullOrEmpty(error)){throw new ValidationException(error);}}嗯,我想试试,但确切的解决办法是理查德·迪明(Richard Deeming)发布的(针对本案).但我也要试试这个,因为我的代码中也有这个特殊情况。我确实希望人们意识到PasswordBox本身是不安全的,因为它会很高兴地为任何要求很好的应用程序解密密码。只需附加到进程,并通过反射,说,“嘿PasswordBox,password属性中有什么?”我知道你可以从内存刮取中得到一点保护,特别是通过避免将其存储在字符串字段中,但对于大多数用例,如果安装了任何恶意负载,那么它已经完蛋了——也许真的不值得为此烦恼。@Daniel-SecureString的不受实时调试器或类似实时威胁的保护关于处理过的威胁的ood解释如下:(同时确保您阅读了Shawn的评论)