wpf mvvm binding passwordbox

passwordbox wpf



EncuadernaciĆ³n de PasswordBox (2)

Estoy empezando con MV-VM y WPF y tengo problemas para entender algunos problemas vinculantes.

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

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

Esto funciona bien, mis valores se actualizan cada vez que el SelectedItem cambia en el ComboBox .

En mi ViewModel tengo un ICommand que utiliza este método para determinar si el botón de inicio de sesión está activo:

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

Así que mi problema es que no tengo el PasswordBox vinculado a la propiedad Password en ViewModel, por lo que no tengo forma de saber cuándo se actualiza.

Entonces, ¿cómo obtengo el valor de PasswordBox para mi ViewModel? Todo lo que he leído solo dice que no enlace un PasswordBox por razones de seguridad. Simplemente eliminaría la restricción de contraseña en CanLogin () pero necesito el valor para pasar a un AccountService.


Interesante.

mira esta publicación de blog y ve si te está ayudando. http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html

Aparentemente el enlace está muerto ahora, así que aquí está la solución original (que se encuentra aquí ):

Puede usar propiedades adjuntas para crear un ayudante como este:

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); } }

Úselo:

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


Publiqué un GIST aquí que es una caja de contraseña enlazable.