I am currently working with a client that is writing a WPF application using VB.NET. One issue we ran into was that you cannot data bind to the password property of the PasswordBox since it is not a dependency property. I stumbled on the following article which details creating PasswordHelper class allowing data binding and keeping with the MVVM pattern.
http://wpftutorial.net/PasswordBox.html
The example is written in C# so I had to port it to VB.NET for my project. Below is the VB.NET version of the PasswordHelper class. The XAML all works the same as the example.
Public NotInheritable Class PasswordHelper
Private Sub New()
End Sub
Public Shared ReadOnly PasswordProperty As DependencyProperty = DependencyProperty.RegisterAttached("Password", GetType(String), GetType(PasswordHelper), New FrameworkPropertyMetadata(String.Empty, New PropertyChangedCallback(AddressOf OnPasswordPropertyChanged)))
Public Shared ReadOnly AttachProperty As DependencyProperty = DependencyProperty.RegisterAttached("Attach", GetType(Boolean), GetType(PasswordHelper), New PropertyMetadata(False, New PropertyChangedCallback(AddressOf Attach)))
Private Shared ReadOnly IsUpdatingProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsUpdating", GetType(Boolean), GetType(PasswordHelper))
Public Shared Sub SetAttach(dp As DependencyObject, value As Boolean)
dp.SetValue(AttachProperty, value)
End Sub
Public Shared Function GetAttach(dp As DependencyObject) As Boolean
Return CBool(dp.GetValue(AttachProperty))
End Function
Public Shared Function GetPassword(dp As DependencyObject) As String
Return DirectCast(dp.GetValue(PasswordProperty), String)
End Function
Public Shared Sub SetPassword(dp As DependencyObject, value As String)
dp.SetValue(PasswordProperty, value)
End Sub
Private Shared Function GetIsUpdating(dp As DependencyObject) As Boolean
Return CBool(dp.GetValue(IsUpdatingProperty))
End Function
Private Shared Sub SetIsUpdating(dp As DependencyObject, value As Boolean)
dp.SetValue(IsUpdatingProperty, value)
End Sub
Private Shared Sub OnPasswordPropertyChanged(sender As System.Windows.DependencyObject, e As System.Windows.DependencyPropertyChangedEventArgs)
Dim passwordBox As PasswordBox = TryCast(sender, PasswordBox)
RemoveHandler passwordBox.PasswordChanged, AddressOf PasswordChanged
If Not CBool(GetIsUpdating(passwordBox)) Then
passwordBox.Password = DirectCast(e.NewValue, String)
End If
AddHandler passwordBox.PasswordChanged, AddressOf PasswordChanged
End Sub
Private Shared Sub Attach(sender As DependencyObject, e As DependencyPropertyChangedEventArgs)
Dim passwordBox As PasswordBox = TryCast(sender, PasswordBox)
If passwordBox Is Nothing Then
Return
End If
If CBool(e.OldValue) Then
RemoveHandler passwordBox.PasswordChanged, AddressOf PasswordChanged
End If
If CBool(e.NewValue) Then
AddHandler passwordBox.PasswordChanged, AddressOf PasswordChanged
End If
End Sub
Private Shared Sub PasswordChanged(sender As Object, e As RoutedEventArgs)
Dim passwordBox As PasswordBox = TryCast(sender, PasswordBox)
SetIsUpdating(passwordBox, True)
SetPassword(passwordBox, passwordBox.Password)
SetIsUpdating(passwordBox, False)
End Sub
End Class

No comments:
Post a Comment