WPF PropertyGrid中的密码/掩码字段未保留

时间:2016-11-01 01:27:34

标签: c# wpf data-binding workflow-foundation-4 propertygrid

我正在尝试为WF re-hoster设计器解决方案中使用的WPF PropertyGrid构建密码(屏蔽)字段。请注意,我对它的安全元素不感兴趣。我只想隐藏用户的密码。我真的很挣扎过一些我认为很容易实现的东西,但最终我找到了这篇很有帮助的文章:

WPF PasswordBox and Data binding

根据文章创建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类(称为PasswordEditor.cs),我假设这是不能正常工作的部分,而且我没有正确设置。

我将PasswordProperty绑定到UserControl的{​​{1}}到Value字段。

PropertyValueEditor

我已尝试将其设置为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; } } 以及我找到的其他WF PropertyValueEditor示例,但无效。

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

有人能指出我正确的方向吗?

感谢。

再次,任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:0)

我最终想通了!!

解决持久性问题:

我更改的第一件事是在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();
    }

希望这有帮助