Question

Je viens juste de commencer avec M-V-VM et WPF et ayant des problèmes de compréhension des problèmes de liaison.

J'ai une page de connexion qui a un ComboBox et un PasswordBox. Le ComboBox ressemble à ceci:

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

Cela fonctionne très bien - mes valeurs sont mis à jour chaque fois que le changement de SelectedItem sur le ComboBox

Dans mon ViewModel j'ai un ICommand qui utilise cette méthode pour déterminer si le bouton de connexion est active:

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

Donc mon problème est que je n'ai pas le PasswordBox lié à la propriété de mot de passe sur le ViewModel - donc je n'ai aucun moyen de dire quand il est mis à jour

.

Alors, comment puis-je obtenir la valeur du PasswordBox à mon ViewModel? Tout ce que j'ai lu juste dit ne se lient pas PasswordBox pour des raisons de sécurité. Je voudrais simplement enlever la restriction de mot de passe du CanLogin () mais je dois la valeur de transmettre à un AccountService.

Était-ce utile?

La solution

Intéressant

.

regardez ce blog et voir si elle vous aide. http://blog.functionalfun.net/2008/06 /wpf-passwordbox-and-data-binding.html

Apparemment, le lien est mort maintenant voici donc la solution originale (qui se trouve href="http://www.wpftutorial.net/PasswordBox.html" ):

Vous pouvez utiliser les propriétés attachées à créer une aide comme ceci:

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

Utilisez:

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

Autres conseils

J'ai posté un rel="noreferrer"> GIST qui est une boîte de mot de passe bindable.

scroll top