gpt4 book ai didi

c# - WPF 重复密码 IMultiValueConverter

转载 作者:行者123 更新时间:2023-11-30 22:59:51 25 4
gpt4 key购买 nike

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

这是我得到的:

WPF:

<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");
}

当我在转换器和命令中设置断点时,我得到以下结果:一旦 View 加载,它就会跳入转换器并尝试转换两个 PasswordBoxes。两者都是空的。当我按下按钮时(两个 PasswordBoxes 中的内容无关紧要)它不会进入转换器并在 command-if 处停止。 P代表空密码。

最佳答案

Convert 方法只会在多绑定(bind)的源属性发生变化时调用,但您绑定(bind)到 PasswordBox 本身并且它永远不会改变。

并且绑定(bind)到 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}" />

如果您希望能够在多个 View 和 PasswordBox 控件中重用此功能,您应该编写 attached behaviour .

关于c# - WPF 重复密码 IMultiValueConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51920617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com