How to bind to a PasswordBox in MVVM

前端 未结 30 2238
执念已碎
执念已碎 2020-11-22 11:50

I have come across a problem with binding to a PasswordBox. It seems it\'s a security risk but I am using the MVVM pattern so I wish to bypass this. I found som

30条回答
  •  暖寄归人
    2020-11-22 12:33

    This implementation is slightly different. You pass a passwordbox to the View thru binding of a property in ViewModel, it doesn't use any command params. The ViewModel Stays Ignorant of the View. I have a VB vs 2010 Project that can be downloaded from SkyDrive. Wpf MvvM PassWordBox Example.zip https://skydrive.live.com/redir.aspx?cid=e95997d33a9f8d73&resid=E95997D33A9F8D73!511

    The way that I am Using PasswordBox in a Wpf MvvM Application is pretty simplistic and works well for Me. That does not mean that I think it is the correct way or the best way. It is just an implementation of Using PasswordBox and the MvvM Pattern.

    Basicly You create a public readonly property that the View can bind to as a PasswordBox (The actual control) Example:

    Private _thePassWordBox As PasswordBox
    Public ReadOnly Property ThePassWordBox As PasswordBox
        Get
            If IsNothing(_thePassWordBox) Then _thePassWordBox = New PasswordBox
            Return _thePassWordBox
        End Get
    End Property
    

    I use a backing field just to do the self Initialization of the property.

    Then From Xaml you bind the Content of a ContentControl or a Control Container Example:

     
    

    From there you have full control of the passwordbox I also use a PasswordAccessor (Just a Function of String) to return the Password Value when doing login or whatever else you want the Password for. In the Example I have a public property in a Generic User Object Model. Example:

    Public Property PasswordAccessor() As Func(Of String)
    

    In the User Object the password string property is readonly without any backing store it just returns the Password from the PasswordBox. Example:

    Public ReadOnly Property PassWord As String
        Get
            Return If((PasswordAccessor Is Nothing), String.Empty, PasswordAccessor.Invoke())
        End Get
    End Property
    

    Then in the ViewModel I make sure that the Accessor is created and set to the PasswordBox.Password property' Example:

    Public Sub New()
        'Sets the Accessor for the Password Property
        SetPasswordAccessor(Function() ThePassWordBox.Password)
    End Sub
    
    Friend Sub SetPasswordAccessor(ByVal accessor As Func(Of String))
        If Not IsNothing(VMUser) Then VMUser.PasswordAccessor = accessor
    End Sub
    

    When I need the Password string say for login I just get the User Objects Password property that really invokes the Function to grab the password and return it, then the actual password is not stored by the User Object. Example: would be in the ViewModel

    Private Function LogIn() as Boolean
        'Make call to your Authentication methods and or functions. I usally place that code in the Model
        Return AuthenticationManager.Login(New UserIdentity(User.UserName, User.Password)
    End Function
    

    That should Do It. The ViewModel doesn't need any knowledge of the View's Controls. The View Just binds to property in the ViewModel, not any different than the View Binding to an Image or Other Resource. In this case that resource(Property) just happens to be a usercontrol. It allows for testing as the ViewModel creates and owns the Property and the Property is independent of the View. As for Security I don't know how good this implementation is. But by using a Function the Value is not stored in the Property itself just accessed by the Property.

提交回复
热议问题