首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复密码IMultiValueConverter

重复密码IMultiValueConverter
EN

Stack Overflow用户
提问于 2018-08-19 18:25:11
回答 2查看 300关注 0票数 2

我希望有一个PasswordBox和另一个PasswordBox来重复选择的密码和提交按钮。

这就是我得到的:

WPF:

代码语言:javascript
复制
<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>

转换器:

代码语言:javascript
复制
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();
    }
}

命令(ChangePassword):

代码语言:javascript
复制
if ((p as string) != "|NOMATCH|")
{
    MessageBox.Show("Password changed");
}
else
{
    MessageBox.Show("Passwords not matching");
}

当我在转换器和命令中设置一个断点时,我得到以下结果:一旦视图加载,它就跳入转换器并尝试转换两个PasswordBoxes。都是空的。当我按下按钮(不管两个PasswordBoxes中有什么)时,它不会进入转换器并停止在命令-if。P表示空密码。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-20 12:49:10

只有当多绑定的源属性发生更改时,才会调用Convert方法,但您要绑定到PasswordBox本身,而且它永远不会更改。

而且绑定到Password属性也不能工作,因为当该属性更改时,PasswordoBox不会引发任何更改通知。

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
<PasswordBox PasswordChar="*" Name="pb1" PasswordChanged="OnPasswordChanged"/>
<PasswordBox PasswordChar="*" Name="pb2" PasswordChanged="OnPasswordChanged"/>
<Button x:Name="btn" Content="Submit" Command="{Binding ChangePassword}" />

如果您希望能够在多个视图和PasswordBox控件中重用此功能,则应该编写一个附随行为

票数 2
EN

Stack Overflow用户

发布于 2018-08-19 20:37:08

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

  • 绑定直接绑定到控制元素(在您的例子中是PasswordBox),您应该始终使用"Path“属性绑定它的(dep)属性,如果您希望绑定不止一次用于值观察(为什么框架不应该触发PropertyChanged事件?您的控件不会更改,但它们的属性可能会更改)
  • 如果您使用TextBox而不是PasswordBox,并将Path=“文本”添加到绑定中,您将得到您所期望的行为。
  • 坏消息:由于安全原因,无法绑定到PasswordBox的密码属性。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51920617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档