WPFPasswordBoxMVVM实现
由于PassWordBox.Password属性非依赖属性,所以不能作为绑定的目标,以下是本人的MVVM实现方法。
PasswordBox.Password与TextBox.Text同步,TextBox只是为了演示,实际使用的是TextBox.Text绑定的Source。
通过Behavior添加PasswordChanged事件的事件处理器,以及自定义一个附加属性实现绑定,Behavior需要引用System.Windows.Interactivity.dll,代码如下:
usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Interactivity;namespacePasswordHelperTest
{publicstaticclassPasswordBoxHelper
{publicstaticreadonlyDependencyPRoperty PasswordProperty =DependencyProperty.RegisterAttached("Password",typeof(string),typeof(PasswordBoxHelper),newFrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));privatestaticvoidOnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
PasswordBox passwordBox= senderasPasswordBox;stringpassword = (string)e.NewValue;if(passwordBox !=null&& passwordBox.Password !=password)
{
passwordBox.Password=password;
}
}publicstaticstringGetPassword(DependencyObject dp)
{return(string)dp.GetValue(PasswordProperty);
}publicstaticvoidSetPassword(DependencyObject dp,stringvalue)
{
dp.SetValue(PasswordProperty, value);
}
}publicclassPasswordBoxBehavior : Behavior<PasswordBox>{protectedoverridevoidOnAttached()
{base.OnAttached();
AssociatedObject.PasswordChanged+=OnPasswordChanged;
}privatestaticvoidOnPasswordChanged(objectsender, RoutedEventArgs e)
{
PasswordBox passwordBox= senderasPasswordBox;stringpassword =PasswordBoxHelper.GetPassword(passwordBox);if(passwordBox !=null&& passwordBox.Password !=password)
{
PasswordBoxHelper.SetPassword(passwordBox, passwordBox.Password);
}
}protectedoverridevoidOnDetaching()
{base.OnDetaching();
AssociatedObject.PasswordChanged-=OnPasswordChanged;
}
}
}
View代码如下:
<Window x:Class="PasswordHelperTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"xmlns:local="clr-namespace:PasswordHelperTest"Title="MainWindow"Height="350"Width="525">
<StackPanel>
<PasswordBox Margin="3"local:PasswordBoxHelper.Password="{Binding Path=Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Behaviors>
<local:PasswordBoxBehavior />
</i:Interaction.Behaviors>
</PasswordBox>
<TextBox Margin="3"Text="{Binding Path=Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
</StackPanel>
</Window>
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Media.Imaging;usingSystem.Windows.Navigation;usingSystem.Windows.Shapes;namespacePasswordHelperTest
{///<summary>///MainWindow.xaml 的交互逻辑///</summary>publicpartialclassMainWindow : Window
{publicMainWindow()
{
InitializeComponent();this.DataContext =newMainWindowViewModel();
}
}
}
ViewModel引用Microsoft.Practices.Prism.dll,代码如下:
usingMicrosoft.Practices.Prism.ViewModel;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacePasswordHelperTest
{classMainWindowViewModel : NotificationObject
{privatestring_password;publicstringPassword
{get{return_password; }set{if(_password !=value)
{
_password=value;this.RaisePropertyChanged("Password");
}
}
}
}
}