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.

È stato utile?

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.

scroll top