WPF PasswordBox MVVM 实现

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

            }
        }

    }
}
时间: 2024-07-29 09:29:28

WPF PasswordBox MVVM 实现的相关文章

WPF之MVVM(Step4)&mdash;&mdash;使用Prism(2)

上一篇简单介绍使用Prism中的NotificationObject,以及DelegateCommand.这一篇更是简单,仅仅描述下DelegateCommand<T>如何使用. ICommand接口一开始提供的就是带参数的方法,而我们使用时经常会遇到那个参数毫无用处的情况,Prism也就帮了偶们一把啦.当然,Prism并没有忘记我们有时还是要参数滴.   在定义上,我们使用ICommand定义,DelegateCommand和DelegateCommand<T>一样.在实例化时有

WPF之MVVM(Step2)&mdash;&mdash;自己实现DelegateCommand:ICommand

在自己实现MVVM时,上一篇的实现方式基本是不用,因其对于命令的处理不够方便,没写一个命令都需要另加一个Command的类.此篇主要介绍DelegateCommand来解决上面所遇到的问题. 首先,我们创建自己的DelegateCommand. 代码如下: /// <summary> /// 实现DelegateCommand /// </summary> class MyDelegateCommand : ICommand { /// <summary> /// 命令

WPF 微信 MVVM 【续】发送部分QQ表情

今天主要记录的就是发送QQ表情, WPF 微信 MVVM里写了,后期为了发送QQ表情,需要把TextBox替换为RichTextBox,接下来就说说替换的过程. 一.支持Binding的RichTextBox RichTextBox虽然支持文字,图片,链接,但是,原生的它不支持Binding,这个对于MVVM是很不方便的,因此,需要给RichTextBox设置一个依赖属性Document,来让它支持绑定,这样才能继续下一步. public class BindableRichTextBox :

浅析WPF中MVVM模式下命令与委托的关系

??各位朋友大家好,我是Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.最近因为项目上的原因开始接触WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种"复古"的软件系统的时候,你应该相信这类东西的确有它们存在的意义.与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系.由此我们可以推论出:一项不流行

CleanAOP实战系列--WPF中MVVM自动更新

CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: [email protected] QQ: 511363759 CleanAOP介绍:https://github.com/Jarvin-Guan/CleanAOP 前言 讲起WPF,开发模式MVVM是必不可少的,使用MVVM模式以后可以在View中写界面,需要使用到的数据则使用绑定的方式写到标签中,那么控制权就放到了ViewModel中,那么有一个需求是每一个使用MVVM者都会有的,就是在后台改变ViewModel的属

在WPF的MVVM框架中获取下拉选择列表中的选中项

文章概述: 本演示介绍如何在WPF的MVVM框架中,通过数据绑定的方式获取下拉列表中的选中项.程序运行后的效果如下图所示: 相关下载(代码.屏幕录像):http://pan.baidu.com/s/1sjwN357 在线播放:http://v.youku.com/v_show/id_XODA5OTYzMDU2.html 温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到[email protected] XAML代码如下所示: <Window x:Class="Demo02E

WPF: 在MVVM中使用Navigtaion

Navigation可以很方便的在页面间进行切换,但是在MVVM模式下,使用Naviation会有一个问题,切换的逻辑需要在ViewModel层完成,但是Navigation需要知道页面的实例或者Uri才能进行切换,那我们如何在ViewModel与UI分离的情况下,用Navigation完成页面的切换呢? 假如有一个程序如下所示,点击Switch之后会从Summary Page切换到另一个页面Detail Page: 在MVVM中,我们需要有三个ViewModel,一个是SummaryViewM

应该是写点儿东西的时候了 -- 基于WPF和MVVM的项目开发 -- 前言

自从来了Sibet就一直在做项目,刚开始的时候是个半成品的体外诊断设备应用软件,关于血栓的弹力图谱绘制和信息管理.原来的软件是外包的,但由于我方没有给后续的经费(如何跟外包公司谈合同尚未经历过)导致乙方做了一半就不愿意再等了,毕竟搭软件的速度还是比硬件的迭代周期要快不少.原版本基于.net 3.5的WinForm开发,类似于很多年前做过的网站项目,代码看起来不吃力,但由于项目的进展软件也要随之做优化和扩展,而原有的MVC软件框架扩展起来实在很麻烦,这时候才发现把逻辑和界面写在一起弊端多多啊.好在

WPF之MVVM模式(3)

有种想写一个MVVM框架的冲动!!! 1.Model中的属性应不应该支持OnPropertyChanged事件? 不应该.应该有ViewModel对该属性进行封装,由ViewModel提供OnPropertyChanged事件.WPF之MVVM(1)中有实例 2.如何将控件事件转换为命令? 在“扩展”中添加“System.Windows.Interractivity”引用 xaml中添加xmlns:i="http://schemas.microsoft.com/expression/2010/i