WPF PropertyGrid中的密码/掩码字段没有被持久化

本文关键字:字段 持久化 掩码 PropertyGrid 密码 WPF | 更新日期: 2023-09-27 18:15:39

我正试图为WPF PropertyGrid建立一个密码(遮罩)字段,该字段用于WF重新主机设计器解决方案。注意,我对它的安全元素不感兴趣。我只是想对用户隐藏密码。我真的很纠结于一些我本以为很容易实现的东西,但我最终发现了这篇很棒的文章,它真的很有帮助:

WPF PasswordBox和数据绑定

在按文章创建PasswordBoxAssistant类之后,我用以下XAML和代码创建了一个WPF UserControl:

XAML

<Grid>
    <PasswordBox x:Name="PasswordBox"
                 Background="Green" 
                 local:PasswordBoxAssistant.BindPassword="true" 
                 local:PasswordBoxAssistant.BoundPassword="{Binding Password,
                 Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

后台代码:

public partial class PasswordUserControl : UserControl
{
    public PasswordUserControl()
    {
        InitializeComponent();
    }
    public static readonly DependencyProperty PasswordProperty = 
      DependencyProperty.Register("Password",
      typeof(string), typeof(PasswordUserControl),
      new FrameworkPropertyMetadata(PasswordChanged));
    public string Password
    {
        get
        {
            return (string)GetValue(PasswordProperty);
        }
        set
        {
            SetValue(PasswordProperty, value);
        }
    }
    private static void PasswordChanged(DependencyObject source, 
       DependencyPropertyChangedEventArgs e)
    {
        if (e.NewValue != null)
        {
            (source as PasswordUserControl)?.UpdatePassword(e.NewValue.ToString());
        }
        else
        {
            (source as PasswordUserControl)?.UpdatePassword(string.Empty);
        }
    }
    private void UpdatePassword(string newText)
    {
        PasswordBox.Password = Password;
    }
}

然后我创建了一个PropertyValueEditor类(称为passwordeitor .cs),我假设这是不工作的部分,我没有正确设置。

我将UserControl的PasswordProperty绑定到PropertyValueEditorValue字段。

public class PasswordEditor : PropertyValueEditor
{
    public PasswordEditor()
    {
        this.InlineEditorTemplate = new DataTemplate();
        FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel));
        FrameworkElementFactory passwordBox = new 
                    FrameworkElementFactory(typeof(PasswordUserControl));
        Binding passwordBoxBinding = new Binding("Value") { Mode = BindingMode.TwoWay };
        passwordBox.SetValue(PasswordUserControl.PasswordProperty, passwordBoxBinding);
        stack.AppendChild(passwordBox);
        this.InlineEditorTemplate.VisualTree = stack;
    }
}

我试图将其设置为StringValue以及我发现的其他WF PropertyValueEditor示例,但无济于事。

密码(掩码)字段现在在我的WPF PropertyGrid中正确显示,但当我切换到另一个WF活动并切换回包含密码字段的活动时,它不会持久值。

谁能给我指个正确的方向?

谢谢。如有任何帮助,我将不胜感激。

谢谢。

WPF PropertyGrid中的密码/掩码字段没有被持久化

我终于想通了!!

解决持久性问题:

我改变的第一件事是在XAML代码中,我将绑定的Password属性更改为Value:
<Grid>
    <PasswordBox x:Name="PasswordBox"
                 Background="Green" 
                 local:PasswordBoxAssistant.BindPassword="true" 
                 local:PasswordBoxAssistant.BoundPassword="{Binding Value, Mode=TwoWay, 
                 UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

我改变的第二件事是在PasswordEditor中,我调用SetValue而不是SetBinding,所以这被改为:

passwordBox.SetBinding(PasswordUserControl.PasswordProperty, 
                       passwordBoxBinding);

现在剩下的奇怪的问题是,当我在PasswordUserControl中包含的PasswordBox中键入字符时,它不知怎么地总是将光标放在第一个位置,这a)真的很奇怪,看起来是错误的,b)它导致密码向后,所以如果我键入'Hello',它将是'olleH'。

我知道要解决这个问题并继续前进,我可以每次都简单地反转字符串,但是让光标停留在文本框的前面对我来说太奇怪了,所以我真的很想弄清楚是什么原因造成的。

解决光标位置和字符串反转的问题:

我改变了PasswordUserControl:

中的PasswordChanged事件
    private static void PasswordChanged(DependencyObject source,
      DependencyPropertyChangedEventArgs e)
    {
        var passwordUserControl = source as PasswordUserControl;
        if (passwordUserControl != null)
            if (e.NewValue != null) passwordUserControl.Password =
                e.NewValue.ToString();
    }

希望能有所帮助