我有一个包含两个密码字段的表单 - 一个是用户输入密码的地方,另一个是用户必须重新输入该密码才能确认的地方。验证用于确认两个密码匹配 - 如果匹配,则启用一个按钮以允许用户继续:
<PasswordBox Name="P1Box" src:PasswordBoxAssistant.BindPassword="True">
<src:PasswordBoxAssistant.BoundPassword>
<Binding Source="{StaticResource mybinding}" Path="Password.P1" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
<Binding.ValidationRules>
<DataErrorValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</src:PasswordBoxAssistant.BoundPassword>
</PasswordBox>
Run Code Online (Sandbox Code Playgroud)
按钮样式:
<Setter Property="IsEnabled" Value="False"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=P1Box, Path=(Validation.HasError)}" Value="false"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="true"/>
</MultiDataTrigger>
</Style.Triggers>
Run Code Online (Sandbox Code Playgroud)
我的问题是用户可以更改第一个框中的密码,并且不会强制第二个密码框重新验证。例如,如果第一个密码输入为“password”,而用户在第二个框中输入“password”,则验证通过并启用按钮。如果用户随后将原始密码框更改为“PASSWORD”,则两个框都将保持验证状态 - 原始框是因为对非空密码没有限制,第二个是因为没有任何内容强制更新验证。
我的密码框使用此处概述的附加属性来允许绑定到密码。因此,我找不到以本解决方案中表达的方式在代码隐藏中访问它的方法(因为 PasswordBox.Password 本身不是依赖属性)。或者,也许它只是不适用于附加属性 - 下面的代码没有做任何事情:
P2Box.GetBindingExpression(PasswordBoxAssistant.BoundPassword).UpdateSource();
Run Code Online (Sandbox Code Playgroud)
我有一个自定义类,它继承 IDataErrorInfo 以允许在两个控件之间进行验证 - 绑定是一个 PasswordData 对象,并且密码框设置为 PasswordData.P1 和 PasswordData.P2:
public class PasswordData : IDataErrorInfo
{
public string P1 { get; set; }
public string …Run Code Online (Sandbox Code Playgroud)