PasswordBox Binding
-
23-08-2019 - |
Domanda
Sono appena iniziato con M-V-VM e WPF e che hanno problemi di comprensione di alcuni aspetti vincolanti.
Ho una pagina di login che ha un ComboBox
e PasswordBox
. Il ComboBox
assomiglia a questo:
<ComboBox Name="comboBox1" SelectedItem="{Binding Path=Username}">
Questo funziona bene - i miei valori vengono aggiornati ogni volta che il cambiamento SelectedItem
sul ComboBox
Nel mio ViewModel ho un ICommand
che utilizza questo metodo per determinare se il pulsante Login è attiva:
public bool CanLogin()
{
return !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password);
}
Quindi il mio problema è che non ho la PasswordBox
legata alla proprietà Password sul ViewModel - quindi non ho modo di dire quando è aggiornato
Quindi, come faccio ad avere il valore della PasswordBox
alla mia ViewModel? Tutto quello che ho letto dice solo che non associare un PasswordBox
per motivi di sicurezza. Vorrei semplicemente togliersi la restrizione password sul CanLogin (), ma ho bisogno del valore per passare insieme a un AccountService.
Soluzione
Interessante.
guardare a questo post del blog e vedere se si sta aiutando. http://blog.functionalfun.net/2008/06 /wpf-passwordbox-and-data-binding.html
A quanto pare il link è morto: ecco la soluzione originale (href="http://www.wpftutorial.net/PasswordBox.html" qui ):
È possibile utilizzare proprietà associate per creare un aiuto in questo modo:
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); } }
Si usa:
<PasswordBox w:PasswordHelper.Attach="True"
w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}"
Width="100"/>
Altri suggerimenti
Ho pubblicato un rel="noreferrer"> GIST che è una scatola della password associabile.