C# WPF重复密码IMultiValueConverter

C# WPF重复密码IMultiValueConverter,c#,wpf,multibinding,passwordbox,imultivalueconverter,C#,Wpf,Multibinding,Passwordbox,Imultivalueconverter,我想要一个密码箱和另一个密码箱来重复选择的密码和一个提交按钮 这就是我得到的: WPF: 在转换器和命令中设置断点时,得到以下结果: 一旦视图加载,它就会跳入转换器并尝试转换两个密码框。两个都是空的。 当我按下按钮时(这与两个密码框中的内容无关),它不会进入转换器,并在命令出现时停止。P表示一个空密码。 在代码中有许多错误的事情需要考虑: 您的绑定是直接绑定到控制元素(在您的例子中是PasswordBox)上的,如果希望多次应用绑定以进行值观察,您应该始终使用“Path”属性绑定它的(dep)

我想要一个密码箱和另一个密码箱来重复选择的密码和一个提交按钮

这就是我得到的:

WPF:

在转换器和命令中设置断点时,得到以下结果: 一旦视图加载,它就会跳入转换器并尝试转换两个密码框。两个都是空的。
当我按下按钮时(这与两个密码框中的内容无关),它不会进入转换器,并在命令出现时停止。P表示一个空密码。

在代码中有许多错误的事情需要考虑:

  • 您的绑定是直接绑定到控制元素(在您的例子中是PasswordBox)上的,如果希望多次应用绑定以进行值观察,您应该始终使用“Path”属性绑定它的(dep)属性(框架为什么要触发PropertyChanged事件?控件不会更改,但其属性可能会更改)
  • 如果使用TextBox而不是PasswordBox,并将Path=“Text”添加到绑定中,则会得到预期的行为
  • 坏消息:由于安全原因,您无法绑定到PasswordBox的Password属性

只有当多重绑定的源属性更改时,才会调用
Convert
方法,但是您绑定到
密码箱本身,并且它从不更改

并且绑定到
Password
属性也不起作用,因为
PasswordoBox
在该属性更改时不会发出更改通知

但它确实会引发一个
PasswordChanged
事件,因此您可以处理该事件,并在此事件处理程序中设置
CommandParameter
属性,而不是使用转换器:

private void OnPasswordChanged(object sender, RoutedEventArgs e)
{
    string password = "|NOMATCH|";
    List<PasswordBox> pb = new List<PasswordBox>(2) { };
    List<string> s = new List<string>[2] { SHA512(pb1.Password), SHA512(pb2.Password) };
    if (s[0] == s[1])
        password = s[0];

    btn.CommandParameter = password;
}
private void OnPasswordChanged(对象发送方,RoutedEventTargets e)
{
字符串密码=“|NOMATCH |”;
列表pb=新列表(2){};
List s=新列表[2]{SHA512(pb1.Password),SHA512(pb2.Password)};
如果(s[0]==s[1])
密码=s[0];
btn.CommandParameter=密码;
}
XAML:

<PasswordBox PasswordChar="*" Name="pb1" PasswordChanged="OnPasswordChanged"/>
<PasswordBox PasswordChar="*" Name="pb2" PasswordChanged="OnPasswordChanged"/>
<Button x:Name="btn" Content="Submit" Command="{Binding ChangePassword}" />


如果您希望能够跨多个视图和
PasswordBox
控件重用此功能,则应编写一个。

您需要通知按钮的命令,其中一个PasswordBox有更新。
if ((p as string) != "|NOMATCH|")
{
    MessageBox.Show("Password changed");
}
else
{
    MessageBox.Show("Passwords not matching");
}
private void OnPasswordChanged(object sender, RoutedEventArgs e)
{
    string password = "|NOMATCH|";
    List<PasswordBox> pb = new List<PasswordBox>(2) { };
    List<string> s = new List<string>[2] { SHA512(pb1.Password), SHA512(pb2.Password) };
    if (s[0] == s[1])
        password = s[0];

    btn.CommandParameter = password;
}
<PasswordBox PasswordChar="*" Name="pb1" PasswordChanged="OnPasswordChanged"/>
<PasswordBox PasswordChar="*" Name="pb2" PasswordChanged="OnPasswordChanged"/>
<Button x:Name="btn" Content="Submit" Command="{Binding ChangePassword}" />