Plingdollar

14 Apr 2017

The Pragmatic PasswordBox

In WPF the PasswordBox control does not expose the password it contains through data binding. It is a security feature designed to protect the sensitive data the box contains. It is however quite a faff and has sparked much debate.

Recently I’ve been experimenting with ReactiveUI. ReactiveUI brings together the elegance and power of Reactive Extensions (RX) and MVVM to provide a clean, simple, and reactive way to build interfaces. One of the key tenets of ReactiveUI is that it’s not actually bad to put logic in code-behind. With that in mind the power of Rx provides an elegant way to bind the contents of a PasswordBox to the view model.

Observable.FromEvent<RoutedEventArgs,SecureString>(a =>
{
     RoutedEventHandler proxy = (_, args) =>
     {
         a(Password.SecurePassword);
     };
     return proxy;
},
h => Password.PasswordChanged += h,
h => Password.PasswordChanged -= h)
    .BindTo(this, x => x.ViewModel.Password);

I think this is a pretty elegant solution to the whole problem. ReactiveUI calls these hack bindings, and they are, but sometimes as a developer you have to break out a little pragmatism.

I have also found this technique useful to bind the SelectedItems property of a ListBox or ListView control back to the view model. Use it sparingly though. It’s difficult to test and debug these bindings.