12

我刚刚开始使用 MV-VM 和 WPF,并且在理解一些绑定问题时遇到了问题。

我有一个登录页面,其中包含一个ComboBox和一个PasswordBox. ComboBox看起来像这样:

<ComboBox Name="comboBox1" SelectedItem="{Binding Path=Username}">

这很好用 - 每次SelectedItem更改时我的值都会更新ComboBox

在我的 ViewModel 中,我有一个ICommand使用此方法来确定登录按钮是否处于活动状态:

public bool CanLogin()
{
    return !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password);
}

所以我的问题是我没有PasswordBox绑定到 ViewModel 上的 Password 属性 - 所以我无法判断它何时更新。

那么如何获得PasswordBoxViewModel 的值呢?PasswordBox我读过的所有内容都只是说出于安全原因不要绑定 a 。我会简单地取消对 CanLogin() 的密码限制,但我需要将值传递给 AccountService。

4

2 回答 2

27

有趣的。

查看此博客文章,看看它是否对您有所帮助。 http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html

显然链接现在已经死了,所以这是原始解决方案(在此处找到):

你可以使用附加的属性来创建一个这样的助手:

公共静态类 PasswordHelper
{
    公共静态只读 DependencyProperty PasswordProperty =
        DependencyProperty.RegisterAttached("密码",
        typeof(字符串),typeof(密码助手),
        新的 FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

    公共静态只读 DependencyProperty AttachProperty =
        DependencyProperty.RegisterAttached("附加",
        typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, Attach));

    私有静态只读 DependencyProperty IsUpdatingProperty =
       DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
       类型(密码助手));


    公共静态无效 SetAttach(DependencyObject dp,布尔值)
    {
        dp.SetValue(附加属性,值);
    }

    公共静态布尔 GetAttach(DependencyObject dp)
    {
        返回 (bool)dp.GetValue(AttachProperty);
    }

    公共静态字符串 GetPassword(DependencyObject dp)
    {
        返回(字符串)dp.GetValue(密码属性);
    }

    公共静态无效 SetPassword(DependencyObject dp,字符串值)
    {
        dp.SetValue(密码属性,值);
    }

    私有静态布尔 GetIsUpdating(DependencyObject dp)
    {
        返回(布尔)dp.GetValue(IsUpdatingProperty);
    }

    私有静态无效 SetIsUpdating(DependencyObject dp,布尔值)
    {
        dp.SetValue(IsUpdatingProperty, value);
    }

    私有静态无效 OnPasswordPropertyChanged(DependencyObject 发件人,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = 作为 PasswordBox 的发件人;
        passwordBox.PasswordChanged -= PasswordChanged;

        if (!(bool)GetIsUpdating(passwordBox))
        {
            passwordBox.Password = (string)e.NewValue;
        }
        passwordBox.PasswordChanged += PasswordChanged;
    }

    私人静态无效附加(DependencyObject发件人,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = 作为 PasswordBox 的发件人;

        如果(密码框 == 空)
            返回;

        if ((bool)e.OldValue)
        {
            passwordBox.PasswordChanged -= PasswordChanged;
        }

        if ((bool)e.NewValue)
        {
            passwordBox.PasswordChanged += PasswordChanged;
        }
    }

    私有静态无效密码更改(对象发送者,RoutedEventArgs e)
    {
        PasswordBox passwordBox = 作为 PasswordBox 的发件人;
        SetIsUpdating(密码框,真);
        设置密码(密码框,密码框.密码);
        SetIsUpdating(密码框,假);
    }
}

用它:

<PasswordBox w:PasswordHelper.Attach="True" 
             w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}" 
             Width="100"/>
于 2009-05-20T16:37:32.037 回答
9

我在这里发布了一个 GIST ,它是一个可绑定的密码框。

于 2010-07-09T16:16:35.693 回答