PasswordBox Encuadernación
-
23-08-2019 - |
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.
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.