我想要一个密码框和另一个密码框来重复选择的密码和一个提交按钮。
这就是我得到的:
可湿性工作基金会:
<UserControl.Resources>
<converter:PasswordConverter x:Key="PasswdConv"/>
</UserControl.Resources>
<PasswordBox PasswordChar="*" Name="pb1"/>
<PasswordBox PasswordChar="*" Name="pb2"/>
<Button Content="Submit" Command="{Binding ChangePassword}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource PasswdConv}">
<MultiBinding.Bindings>
<Binding ElementName="pb1"/>
<Binding ElementName="pb2"/>
</MultiBinding.Bindings>
</MultiBinding>
</Button.CommandParameter>
</Button>
转炉:
public class PasswordConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
List<string> s = values.ToList().ConvertAll(p => SHA512(((PasswordBox)p).Password));
if (s[0] == s[1])
return s[0];
return "|NOMATCH|";
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
命令(更改密码(:
if ((p as string) != "|NOMATCH|")
{
MessageBox.Show("Password changed");
}
else
{
MessageBox.Show("Passwords not matching");
}
当我在转换器和命令中设置断点时,我得到以下结果: 一旦视图加载,它就会跳入转换器并尝试转换两个密码框。两者都是空的。 当我按下按钮(两个密码框中的内容无关紧要(时,它不会进入转换器并停止在命令 if 处。P 表示空密码。
仅当多绑定的源属性发生更改,但绑定到PasswordBox
本身并且永远不会更改时,才会调用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;
}
XAML:
<PasswordBox PasswordChar="*" Name="pb1" PasswordChanged="OnPasswordChanged"/>
<PasswordBox PasswordChar="*" Name="pb2" PasswordChanged="OnPasswordChanged"/>
<Button x:Name="btn" Content="Submit" Command="{Binding ChangePassword}" />
如果希望能够在多个视图和PasswordBox
控件中重用此功能,则应编写附加行为。
在你的代码中需要考虑多个错误的事情:
- 您的绑定直接绑定到控制元素(在您的情况下是 PasswordBox(,如果您希望多次应用绑定以进行值观察,则应始终使用 "Path" 属性绑定到它的 (dep( 属性上(为什么框架应该触发 PropertyChanged 事件?控件不会更改,但其属性可能会更改(
- 如果使用 TextBox 而不是 PasswordBox,并将 Path="Text" 添加到绑定中,则会得到预期的行为
- 坏消息:由于安全原因,您无法绑定到密码框的密码属性。