2017-02-18 4 views
-1

Ich schreibe WPF MVVM Prism 6.2 Anwendung. In der Ansicht des Login-Fensters (das ist PrismUserControl) habe ich eine PaswordBox gebunden (via Behavior) an die 'Password'-Eigenschaft im View-Modell. PasswordBox muss jedes Mal leer sein, wenn das Anmeldefenster während der Ausführung der Anwendung aufgerufen wird.(Zum Beispiel, nachdem der Benutzer die aktuelle Sitzung geschlossen hat, muss er oder sie nur leere Shell und Login-Fenster über der Shell sehen.) Mein Problem ist, dass die oben erwähnte PasswordBox nur zum ersten Mal nach dem Laden der Anwendung leer angezeigt wird. Wenn die PaswordBox zum zweiten oder dritten Mal e.t.c angezeigt wird, ist sie nicht leer. Bitte beachten Sie das Bild unten:So löschen Sie WPF PasswordBox an ViewModel über Verhalten gebunden?

enter image description here

Wie Sie sehen können Kennwort nicht leer ist, aber es muss in diesem Fall leer sein. Im Folgenden finden Sie XAML-Schnipsel aus Login-Fenster Markup wo die PaswordBox ist:

. . . . . . . . . . . . . . 
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
. . . . . . . . . . . . . . 
<PasswordBox Grid.Row="1" Grid.Column="1" Height="30" Margin="0 10 5 0" AutomationProperties.AutomationId="UserPasswordBox"> 
     <i:Interaction.Behaviors> 
      <behavior:PasswordBoxBindingBehavior Password="{Binding Password}"/> 
     </i:Interaction.Behaviors> 
</PasswordBox> 
. . . . . . . . . . . . . . . . 

unterhalb der Klasse des Verhaltens ist, die auch in XAML, wie Sie können sich über involviert ist:

public class PasswordBoxBindingBehavior : Behavior<PasswordBox> 
{ 
    protected override void OnAttached() 
    { 
     AssociatedObject.PasswordChanged += OnPasswordBoxValueChanged; 
    } 

    public SecureString Password 
    { 
     get { return (SecureString)GetValue(PasswordProperty); } 
     set { SetValue(PasswordProperty, value); } 
    } 

    public static readonly DependencyProperty PasswordProperty = 
     DependencyProperty.Register("Password", typeof(SecureString), typeof(PasswordBoxBindingBehavior), new PropertyMetadata(null)); 

    private void OnPasswordBoxValueChanged(object sender, RoutedEventArgs e) 
    { 
     var binding = BindingOperations.GetBindingExpression(this, PasswordProperty); 
     if (binding != null) 
     { 
      PropertyInfo property = binding.DataItem.GetType().GetProperty(binding.ParentBinding.Path.Path); 
      if (property != null) 
       property.SetValue(binding.DataItem, AssociatedObject.SecurePassword, null); 
     } 
    } 
} 

Und unten ist ' Passwort 'Eigenschaft, die im View-Modell ist. Die PasswordBox wird diese Eigenschaft über PasswordBoxBindingBehavior gebunden:

public SecureString Password 
{ 
    get { return this._password; } 
    set { this.SetProperty(ref this._password, value); } 
} 

Ich brauche, dass die PasswordBox jedes Mal leer sein, wenn Login-Fenster während der Anwendung angezeigt wird. Ich habe versucht, programmatisch "Passwort" -Eigenschaft im Ansichtsmodell zu löschen, aber es hilft nicht. Wie kann ich es tun? Bitte helfen Sie.

Antwort

3

Sie könnten eine PropertyChangedCallback für die Password Abhängigkeitseigenschaft Ihres Verhaltens anschließen, die die Password Eigenschaft des PasswordBox auf eine leere Zeichenfolge setzt, wenn die Password Quelleigenschaft des View-Modell auf null gesetzt:

public class PasswordBoxBindingBehavior : Behavior<PasswordBox> 
{ 
    protected override void OnAttached() 
    { 
     AssociatedObject.PasswordChanged += OnPasswordBoxValueChanged; 
    } 

    public SecureString Password 
    { 
     get { return (SecureString)GetValue(PasswordProperty); } 
     set { SetValue(PasswordProperty, value); } 
    } 

    public static readonly DependencyProperty PasswordProperty = 
     DependencyProperty.Register("Password", typeof(SecureString), typeof(PasswordBoxBindingBehavior), new PropertyMetadata(OnSourcePropertyChanged)); 

    private static void OnSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if(e.NewValue == null) 
     { 
      PasswordBoxBindingBehavior behavior = d as PasswordBoxBindingBehavior; 
      behavior.AssociatedObject.PasswordChanged -= OnPasswordBoxValueChanged; 
      behavior.AssociatedObject.Password = string.Empty; 
      behavior.AssociatedObject.PasswordChanged += OnPasswordBoxValueChanged; 
     } 
    } 

    private static void OnPasswordBoxValueChanged(object sender, RoutedEventArgs e) 
    { 
     PasswordBox passwordBox = sender as PasswordBox; 
     var behavior = Interaction.GetBehaviors(passwordBox).OfType<PasswordBoxBindingBehavior>().FirstOrDefault(); 
     if(behavior != null) 
     { 
      var binding = BindingOperations.GetBindingExpression(behavior, PasswordProperty); 
      if (binding != null) 
      { 
       PropertyInfo property = binding.DataItem.GetType().GetProperty(binding.ParentBinding.Path.Path); 
       if (property != null) 
        property.SetValue(binding.DataItem, passwordBox.SecurePassword, null); 
      } 
     } 
    } 
} 

Dann können Sie die PasswordBox löschen, indem Sie einfach die Quelleigenschaft Password in Ihrem Ansichtsmodell auf null setzen.

+0

mm8, vielen Dank für Ihre Hilfe. Jetzt ist das Passwort jedes Mal gelöscht, wenn das Anmeldefenster angezeigt wird. – Prohor

+1

So funktioniert es dann wie erwartet? Bitte denken Sie daran, die Antwort zu akzeptieren und stimmen Sie ab: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – mm8

+0

das ist sehr clever, erlaubt mir, PasswordBox in MVVM zu verwenden, Danke für die Idee und den Code – ktingle

Verwandte Themen