由于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="" Width="">
<StackPanel>
<PasswordBox Margin="" local:PasswordBoxHelper.Password="{Binding Path=Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Behaviors>
<local:PasswordBoxBehavior />
</i:Interaction.Behaviors>
</PasswordBox>
<TextBox Margin="" 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");
} }
} }
}

最新文章

  1. 教你如何做Lotus Domino的应用开发
  2. JUnit3的作用
  3. ubuntu安装搜狗输入法
  4. 【新手练习】类似Path的按钮,
  5. mysql Communications link failure,C3p0的参数详解
  6. poj 1821 动态规划
  7. windows 2008 R2 Activition
  8. 熟知CDN
  9. 在ASP.NET Core下使用SignalR技术
  10. Openstack_O版(otaka)部署_准备环境和依赖软件
  11. Linux下JNA 调用 so 库
  12. CF997C Sky Full of Stars 数论
  13. Codeforce 287A - IQ Test (模拟)
  14. 10慕课网《进击Node.js基础(一)》初识promise
  15. RabbitMQ消费端消息的获取方式(.Net Core)
  16. 关于Spring-Data-Jpa的一些理解
  17. Pymongo NotMasterError while fetching count of the collection as per query from MongoDB in DRF
  18. winform datagridview 打印
  19. plsql只有注释显示问号,其余中文可以正常显示
  20. Socket 进行发送

热门文章

  1. 管理Bean的生命周期
  2. noip模拟赛 洗澡
  3. codevs4343 找回密码
  4. 学一学书里的django是怎么写views.py的
  5. 递归算法(java)
  6. docker mysql 主从配置
  7. sql-server-storage-internals
  8. Android学习路线(十八)支持不同设备——支持不同的屏幕
  9. PHP array_multisort()
  10. 如何使用VB编写Excel的COM组件