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