由于PassWordBox.Password屬性非依賴屬性,所以不能作為綁定的目標,以下是本人的MVVM實現方法。
PasswordBox.Password與TextBox.Text同步,TextBox只是為了演示,實際使用的是TextBox.Text綁定的Source。
通過Behavior添加PasswordChanged事件的事件處理器,以及自定義一個附加屬性實現綁定,Behavior需要引用System.Windows.Interactivity.dll,代碼如下:
using System.Windows;using System.Windows.Controls;using System.Windows.Interactivity;namespace PasswordHelperTest{ public static class PasswordBoxHelper { public static readonly DependencyPRoperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordBoxHelper), new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged)); private static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { PasswordBox passwordBox = sender as PasswordBox; string password = (string)e.NewValue; if (passwordBox != null && passwordBox.Password != password) { passwordBox.Password = password; } } public static string GetPassword(DependencyObject dp) { return (string)dp.GetValue(PasswordProperty); } public static void SetPassword(DependencyObject dp, string value) { dp.SetValue(PasswordProperty, value); } } public class PasswordBoxBehavior : Behavior<PasswordBox> { protected override void OnAttached() { base.OnAttached(); AssociatedObject.PasswordChanged += OnPasswordChanged; } private static void OnPasswordChanged(object sender, RoutedEventArgs e) { PasswordBox passwordBox = sender as PasswordBox; string password = PasswordBoxHelper.GetPassword(passwordBox); if (passwordBox != null && passwordBox.Password != password) { PasswordBoxHelper.SetPassword(passwordBox, passwordBox.Password); } } protected override void OnDetaching() { 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>
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace PasswordHelperTest{ /// <summary> /// MainWindow.xaml 的交互邏輯 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.DataContext = new MainWindowViewModel(); } }}
ViewModel引用Microsoft.Practices.Prism.dll,代碼如下:
using Microsoft.Practices.Prism.ViewModel;using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PasswordHelperTest{ class MainWindowViewModel : NotificationObject { private string _password; public string Password { get { return _password; } set { if (_password != value) { _password = value; this.RaisePropertyChanged("Password"); } } } }}
新聞熱點
疑難解答