WPFPasswordBoxMVVM实现

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: 小 | 中 | 大 | 超大  

由于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");

}

}

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有