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
Das Übertragen des Passworts in mein ViewModel habe ich per Code Behind:
Die beiden Properties
Spoiler anzeigen
Der Button, der zwischen TextBox Und PasswordBox umschaltet, ändert diese Property:
Spoiler anzeigen
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
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:
XML-Quellcode
- <PasswordBox Name="MeinePassWortBox" PasswordChanged="PasswordBox_PasswordChanged" Visibility="{Binding PassWortZeigen, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0"/>
- <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:
Die beiden Properties
PassWort
und SicheresPassWort
im ViewModel sehen so aus:VB.NET-Quellcode
- Private _SicheresPassWort As SecureString
- Public Property SicheresPassWort As SecureString
- Get
- Return _SicheresPassWort
- End Get
- Set(value As SecureString)
- _SicheresPassWort = value
- _PassWort = New NetworkCredential("", SicheresPassWort).Password
- RaisePropertyChanged()
- End Set
- End Property
- Private _PassWort As String
- Public Property PassWort As String
- Get
- Return _PassWort
- End Get
- Set(value As String)
- _PassWort = value
- _SicheresPassWort = New NetworkCredential("", PassWort).SecurePassword
- RaisePropertyChanged()
- End Set
- End Property
Der Button, der zwischen TextBox Und PasswordBox umschaltet, ändert diese Property:
VB.NET-Quellcode
- Private _PassWortZeigen As Visibility
- Public Property PassWortZeigen As Visibility
- Get
- Return _PassWortZeigen
- End Get
- Set(value As Visibility)
- If value = Visibility.Visible Then
- EyeIcon = Eye
- TextZeigen = Visibility.Hidden
- Debug.WriteLine(PassWort)
- RaisePropertyChanged(NameOf(PassWort))
- RaisePropertyChanged(NameOf(SicheresPassWort))
- Else
- EyeIcon = NonEye
- TextZeigen = Visibility.Visible
- RaisePropertyChanged(NameOf(PassWort))
- RaisePropertyChanged(NameOf(SicheresPassWort))
- End If
- _PassWortZeigen = value
- RaisePropertyChanged()
- End Set
- 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:
VB.NET-Quellcode
- Private Sub PasswordBox_PasswordChanged(sender As Object, e As RoutedEventArgs)
- MeineTextBox.Text = New NetworkCredential("", MeinePassWortBox.Password).Password
- SetSelection(MeinePassWortBox, MeinePassWortBox.Password.Length, 0)
- End Sub
- Private Sub MeineTextBox_TextChanged(sender As Object, e As TextChangedEventArgs)
- MeinePassWortBox.Password = New NetworkCredential("", MeineTextBox.Text).Password
- End Sub
- Private Sub SetSelection(ByVal passwordBox As PasswordBox, ByVal start As Integer, ByVal length As Integer)
- passwordBox.[GetType]().GetMethod("Select", BindingFlags.Instance Or BindingFlags.NonPublic).Invoke(passwordBox, New Object() {start, length}) 'CursorPosition ans Ende setzen
- End Sub
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kafffee“ ()