Pregunta

Me acaba de empezar con M-V-VM y WPF y que tienen problemas de comprensión de algunos temas relacionados con combinaciones.

Tengo una página de inicio de sesión que tiene un ComboBox y una PasswordBox. El ComboBox se ve así:

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

Esto funciona muy bien - mis valores se actualizan cada vez que el SelectedItem cambios en la ComboBox

En mi modelo de vista Tengo una ICommand que utiliza este método para determinar si el botón de inicio de sesión es activa:

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

Así que mi problema es que no tengo la PasswordBox unido a la propiedad Password en el modelo de vista - así que no tengo forma de saber cuando se actualiza

.

Entonces, ¿cómo puedo obtener el valor de la PasswordBox a mi modelo de vista? Todo lo que he leído sólo dice no se unen a un PasswordBox por razones de seguridad. Yo simplemente quitar la contraseña de restricción en el CanLogin () pero necesito el valor para pasar a lo largo de un AccountService.

¿Fue útil?

Solución

Interesante.

mirar a esta entrada del blog y ver si se le está ayudando. http://blog.functionalfun.net/2008/06 /wpf-passwordbox-and-data-binding.html

Al parecer, el enlace está muerto así que aquí está la solución original (que se encuentra href="http://www.wpftutorial.net/PasswordBox.html" aquí ):

Puede utilizar las propiedades asociadas para crear un ayudante como esto:

public static class PasswordHelper
{
    public static readonly DependencyProperty PasswordProperty =
        DependencyProperty.RegisterAttached("Password",
        typeof(string), typeof(PasswordHelper),
        new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

    public static readonly DependencyProperty AttachProperty =
        DependencyProperty.RegisterAttached("Attach",
        typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, Attach));

    private static readonly DependencyProperty IsUpdatingProperty =
       DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), 
       typeof(PasswordHelper));


    public static void SetAttach(DependencyObject dp, bool value)
    {
        dp.SetValue(AttachProperty, value);
    }

    public static bool GetAttach(DependencyObject dp)
    {
        return (bool)dp.GetValue(AttachProperty);
    }

    public static string GetPassword(DependencyObject dp)
    {
        return (string)dp.GetValue(PasswordProperty);
    }

    public static void SetPassword(DependencyObject dp, string value)
    {
        dp.SetValue(PasswordProperty, value);
    }

    private static bool GetIsUpdating(DependencyObject dp)
    {
        return (bool)dp.GetValue(IsUpdatingProperty);
    }

    private static void SetIsUpdating(DependencyObject dp, bool value)
    {
        dp.SetValue(IsUpdatingProperty, value);
    }

    private static void OnPasswordPropertyChanged(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        passwordBox.PasswordChanged -= PasswordChanged;

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

    private static void Attach(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;

        if (passwordBox == null)
            return;

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

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

    private static void PasswordChanged(object sender, RoutedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        SetIsUpdating(passwordBox, true);
        SetPassword(passwordBox, passwordBox.Password);
        SetIsUpdating(passwordBox, false);
    }
}

Se usa:

<PasswordBox w:PasswordHelper.Attach="True" 
             w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}" 
             Width="100"/>

Otros consejos

He publicado una rel="noreferrer"> GIST que es un cuadro de contraseña enlazable.

scroll top