Problem mit PasswordBox - eingegebenes Passwort anzeigen

  • WPF MVVM
  • .NET (FX) 4.5–4.8

    Problem mit PasswordBox - eingegebenes Passwort anzeigen

    Hallo und Guten Morgen,

    ich versuche gerade eine Passwortbox zu debuggen. Ziel ist es, mit Klick auf einen Button das Passwort dann auch ohne die Platzhalter anzuzeigen. Dazu habe ich eine PasswordBox und eine TextBox übereinander gelegt:

    Spoiler anzeigen

    XML-Quellcode

    1. <PasswordBox Name="MeinePassWortBox" PasswordChanged="PasswordBox_PasswordChanged" Visibility="{Binding PassWortZeigen, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0"/>
    2. <TextBox Name="MeineTextBox" Text="{Binding PassWort, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding TextZeigen, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0"/>


    Das Übertragen des Passworts in mein ViewModel habe ich per Code Behind:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub PasswordBox_PasswordChanged(sender As Object, e As RoutedEventArgs)
    2. If Me.DataContext IsNot Nothing Then
    3. CType(Me.DataContext, PassWordBoxDialogViewModel).SicheresPassWort = (CType(sender, PasswordBox)).SecurePassword
    4. End If
    5. End Sub


    Die beiden Properties PassWort und SicheresPassWort im ViewModel sehen so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private _SicheresPassWort As SecureString
    2. Public Property SicheresPassWort As SecureString
    3. Get
    4. Return _SicheresPassWort
    5. End Get
    6. Set(value As SecureString)
    7. _SicheresPassWort = value
    8. _PassWort = New NetworkCredential("", SicheresPassWort).Password
    9. RaisePropertyChanged()
    10. End Set
    11. End Property
    12. Private _PassWort As String
    13. Public Property PassWort As String
    14. Get
    15. Return _PassWort
    16. End Get
    17. Set(value As String)
    18. _PassWort = value
    19. _SicheresPassWort = New NetworkCredential("", PassWort).SecurePassword
    20. RaisePropertyChanged()
    21. End Set
    22. End Property


    Der Button, der zwischen TextBox Und PasswordBox umschaltet, ändert diese Property:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private _PassWortZeigen As Visibility
    2. Public Property PassWortZeigen As Visibility
    3. Get
    4. Return _PassWortZeigen
    5. End Get
    6. Set(value As Visibility)
    7. If value = Visibility.Visible Then
    8. EyeIcon = Eye
    9. TextZeigen = Visibility.Hidden
    10. Debug.WriteLine(PassWort)
    11. RaisePropertyChanged(NameOf(PassWort))
    12. RaisePropertyChanged(NameOf(SicheresPassWort))
    13. Else
    14. EyeIcon = NonEye
    15. TextZeigen = Visibility.Visible
    16. RaisePropertyChanged(NameOf(PassWort))
    17. RaisePropertyChanged(NameOf(SicheresPassWort))
    18. End If
    19. _PassWortZeigen = value
    20. RaisePropertyChanged()
    21. End Set
    22. End Property


    Das Problem ist, dass wenn ich den Text in der Textbox ändere, dieser nicht in die PasswordBox übernommen wird, wenn ich von sichtbar auch nicht sichtbar umschalte. Andersrum geht es.

    Ich vermute fast, dass das so wie ich mir das vorgestellt habe, nicht funktionieren wird, wegen dem Code Behind, der ja kein "echtes" Binding darstellt. Wenn jemand eine Idee hat, wie das doch gehen könnte, gerne posten. Oder gibt es vielleicht noch andere (einfachere) Wege?

    Edit:
    Hab mich jetzt dazu entschieden, das dann doch komplett per Code Behind zu lösen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub PasswordBox_PasswordChanged(sender As Object, e As RoutedEventArgs)
    2. MeineTextBox.Text = New NetworkCredential("", MeinePassWortBox.Password).Password
    3. SetSelection(MeinePassWortBox, MeinePassWortBox.Password.Length, 0)
    4. End Sub
    5. Private Sub MeineTextBox_TextChanged(sender As Object, e As TextChangedEventArgs)
    6. MeinePassWortBox.Password = New NetworkCredential("", MeineTextBox.Text).Password
    7. End Sub
    8. Private Sub SetSelection(ByVal passwordBox As PasswordBox, ByVal start As Integer, ByVal length As Integer)
    9. passwordBox.[GetType]().GetMethod("Select", BindingFlags.Instance Or BindingFlags.NonPublic).Invoke(passwordBox, New Object() {start, length}) 'CursorPosition ans Ende setzen
    10. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kafffee“ ()