WPF中PasswordBox控件的Password属性的数据绑定

原文:WPF中PasswordBox控件的Password属性的数据绑定

英文原文:http://www.wpftutorial.net/PasswordBox.html

中文原文:http://blog.csdn.net/oyi319/article/details/6551532

WPF的PasswordBox控件的Password属性不是依赖属性,无法直接进行数据绑定,为使其在MVVM模式中正常使用,可以为PasswordBox增加一个助手类,代码如下:

注:代码摘自:http://www.wpftutorial.net/PasswordBox.html

 1 using System.Windows;
 2 using System.Windows.Controls;
 3 namespace Oyi319.Helper
 4 {
 5     /// <summary>
 6     /// 为PasswordBox控件的Password增加绑定功能
 7     /// </summary>
 8     public static class PasswordBoxHelper
 9     {
10         public static readonly DependencyProperty PasswordProperty =
11             DependencyProperty.RegisterAttached("Password",
12             typeof(string), typeof(PasswordBoxHelper),
13             new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));
14         public static readonly DependencyProperty AttachProperty =
15             DependencyProperty.RegisterAttached("Attach",
16             typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, Attach));
17         private static readonly DependencyProperty IsUpdatingProperty =
18            DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
19            typeof(PasswordBoxHelper));
20
21         public static void SetAttach(DependencyObject dp, bool value)
22         {
23             dp.SetValue(AttachProperty, value);
24         }
25         public static bool GetAttach(DependencyObject dp)
26         {
27             return (bool)dp.GetValue(AttachProperty);
28         }
29         public static string GetPassword(DependencyObject dp)
30         {
31             return (string)dp.GetValue(PasswordProperty);
32         }
33         public static void SetPassword(DependencyObject dp, string value)
34         {
35             dp.SetValue(PasswordProperty, value);
36         }
37         private static bool GetIsUpdating(DependencyObject dp)
38         {
39             return (bool)dp.GetValue(IsUpdatingProperty);
40         }
41         private static void SetIsUpdating(DependencyObject dp, bool value)
42         {
43             dp.SetValue(IsUpdatingProperty, value);
44         }
45         private static void OnPasswordPropertyChanged(DependencyObject sender,
46             DependencyPropertyChangedEventArgs e)
47         {
48             PasswordBox passwordBox = sender as PasswordBox;
49             passwordBox.PasswordChanged -= PasswordChanged;
50             if (!(bool)GetIsUpdating(passwordBox))
51             {
52                 passwordBox.Password = (string)e.NewValue;
53             }
54             passwordBox.PasswordChanged += PasswordChanged;
55         }
56         private static void Attach(DependencyObject sender,
57             DependencyPropertyChangedEventArgs e)
58         {
59             PasswordBox passwordBox = sender as PasswordBox;
60             if (passwordBox == null)
61                 return;
62             if ((bool)e.OldValue)
63             {
64                 passwordBox.PasswordChanged -= PasswordChanged;
65             }
66             if ((bool)e.NewValue)
67             {
68                 passwordBox.PasswordChanged += PasswordChanged;
69             }
70         }
71         private static void PasswordChanged(object sender, RoutedEventArgs e)
72         {
73             PasswordBox passwordBox = sender as PasswordBox;
74             SetIsUpdating(passwordBox, true);
75             SetPassword(passwordBox, passwordBox.Password);
76             SetIsUpdating(passwordBox, false);
77         }
78     }
79 }

那么XAML绑定代码如下:

1 <PasswordBox Helper:PasswordBoxHelper.Attach="True" Helper:PasswordBoxHelper.Password="{Binding Path=Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />

MVVM模式XAML窗口声明代码如下:

 1 <Window
 2     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4     xmlns:Helper="clr-namespace:Oyi319.Helper"
 5     xmlns:ViewModels="clr-namespace:Oyi319.ViewModels"
 6     x:Class="Oyi319.Views.Login"
 7     x:Name="Window"
 8     Title="Login"
 9     FocusManager.FocusedElement="{Binding ElementName=txt_UserName}" >
10     <Window.DataContext>
11         <ViewModels:LoginViewModel />
12     </Window.DataContext>
13 </Window>

原文地址:https://www.cnblogs.com/lonelyxmas/p/10218081.html

时间: 2024-08-08 09:58:21

WPF中PasswordBox控件的Password属性的数据绑定的相关文章

WPF中一个控件绑定另一个控件的属性

原文:WPF中一个控件绑定另一个控件的属性 如同一个Grid中的一个按钮根据另一个按钮的显示与否作出不同的响应: 绑定的时候通过ElementName来指定控件 <Grid Margin="50,130"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="40"/> </Grid.ColumnDefinitions>

wpf 中DataGrid 控件的样式设置及使用

本次要实现的效果为: 这个DataGrid需要绑定一个集合对象,所以要先定义一个Experience类,包含三个字段 /// <summary> /// 定义工作经历类 /// </summary> public class Experience { /// <summary> /// 获取或设置工作的起始时间 /// </summary> public string Start { get; set; } /// <summary> /// 获

WPF中窗口控件的跨线程调用

原文:WPF中窗口控件的跨线程调用 在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没有权限,访问了会抛异常: 没有CheckForIllegalCrossThreadCalls 属性,怎么办? 在WPF中的窗口控件都有一个Dispatcher属性,允许访问控件的线程:既然不允许直接访问,就告诉控件我们要干什么就好了. 方法如下: private

C#winform中使用控件的Dock属性进行布局

想要实现如下布局,可以通过设置控件的Dock属性达到效果 1.拖放一个panel控件一个label控件(放在panel中)和一个treeView控件到TestForm中 2.设置panel的Dock属性为Top(设置BorderStyle属性为FixedSingle,这样显得美观些),设置treeView的Dock属性为Fill 3.需要注意的是要先把panel放到TestForm中,先放treeView就会使得treeView填充TestForm而被后放置的panel遮盖,如下所示 4.想要实

WPF中Ribbon控件的使用

这篇博客将分享如何在WPF程序中使用Ribbon控件.Ribbon可以很大的提高软件的便捷性. 上面截图使Outlook 2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可以找到想要的Menu.在Outlook 2003时代,将Home下面的Menu都垂直的排列下来,操作的便捷程度降低了很多.Ribbon的布局会随着窗体的变化动态的调整. 上面的图片中标注了Ribbon的4个区块. 下面我们就在WPF中使用Ribbon控件来实现一个简单的界面. 1. 添加System

wpf中手风琴控件Accordion编辑模板后控件不正常。

昨天有个网友Accordion控件从sl迁移到wpf时候显示不正常.也是就没有效果. 我也是sl做的比较多,wpf玩的少,Accordion模板里触发器,状态组调了一早上都没达到满意效果, 无奈只有百度,发现了老外一个Accordion模板的例子http://blogs.u2u.be/diederik/post/2010/02/20/How-to-play-the-Accordion-WPF-Toolkit.aspx .向我项目里迁移的时候发现,居然不生效!!!! 最后一一对比发现我项目里有sy

WPF中查找控件的扩展类

在wpf中查找控件要用到VisualTreeHelper类,但这个类并没有按照名字查找控件的方法,于是搜索网络,整理出下面这个类,感觉用起来很是方便. 贴出来,供大家参考. /// <summary> /// WPF/Silverlight 查找控件扩展方法 /// </summary> public static class VisualHelperTreeExtension { /// <summary> /// 根据控件名称,查找父控件 /// elementNa

WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书

原文:WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书 最近项目中使用弹出控件Popup,发现弹出框的对齐方式在不同的系统中存在不同(Popup在win10上是弹出在左边,Win7上是弹出在右边).现在记录解决方案于此: 修改弹出菜单相对于相应菜单项是左对齐还是右对齐 // 解决Popup控件在Win7以及Win10等系统中的对齐点方式不一样的问题(以下两种方法均OK) using System.Reflection;    // 方法一 using Sy

C# winform项目中ListView控件使用CheckBoxes属性实现单选功能

在做项目时需要使用ListView控件的CheckBoxes属性显示,还要在点击行时自动选中CheckBoxes和点击选中CheckBoxes时自动显示正行选中状态的单选功能. 效果图: 主要利用两个事件:listView1_ItemCheck和listView1_SelectedIndexChanged事件. 上代码: [csharp] view plain copy print? private void listView1_ItemCheck(object sender, ItemChec