对于PasswordBox,可能很多人都会按着TextBox的路子,在ViewModel里面写一个属性,然后绑定到Password属性上。当你写完这一切的时候,你会突然收到Visual Studio的提示:Password并不是依赖属性,不能绑定.
要先增加一个扩展方类
namespace MacSnManage.Extensions
{
public class PassWordExtensions
{
public static string GetPassWord(DependencyObject obj)
{
return (string)obj.GetValue(PassWordProperty);
}
public static void SetPassWord(DependencyObject obj, string value)
{
obj.SetValue(PassWordProperty, value);
}
// Using a DependencyProperty as the backing store for Password. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PassWordProperty =
DependencyProperty.RegisterAttached("PassWord", typeof(string), typeof(PassWordExtensions), new PropertyMetadata(string.Empty, OnPassWordPropertyChanged));
static void OnPassWordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var passWord = sender as PasswordBox;
string pw = (string)e.NewValue;
if (passWord!=null && passWord.Password != pw)
{
passWord.Password = pw;
}
}
}
public class PasswordBehavior : Behavior<PasswordBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PasswordChanged += AssociatedObject_PasswordChanged;
}
/// <summary>
/// 读内容与更新内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AssociatedObject_PasswordChanged(object sender, RoutedEventArgs e)
{
var passWord = sender as PasswordBox;
string pw = PassWordExtensions.GetPassWord(passWord);
if (passWord!=null && passWord.Password != pw)
{
PassWordExtensions.SetPassWord(passWord, passWord.Password);
}
}
protected override void OnDetaching()
{
base.OnDetaching(); AssociatedObject.PasswordChanged -= AssociatedObject_PasswordChanged;
}
}
}
声明写好的扩展类,以及behaviors
xmlns:pass="clr-namespace:MacSnManage.Extensions"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
下面是绑定
<PasswordBox Margin="0,10"
Style="{StaticResource MaterialDesignFloatingHintPasswordBox}"
DockPanel.Dock="Top"
pass:PassWordExtensions.PassWord="{Binding PassWord, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
VerticalAlignment="Center" Cursor="IBeam">
<i:Interaction.Behaviors>
<pass:PasswordBehavior></pass:PasswordBehavior>
</i:Interaction.Behaviors>
<md:HintAssist.Hint>
<StackPanel Orientation="Horizontal" Margin="-1 0 0 0">
<md:PackIcon Kind="LockCheck" />
<TextBlock Text=" Password" />
</StackPanel>
</md:HintAssist.Hint>
</PasswordBox>
//
pass:PassWordExtensions.PassWord="{Binding PassWord, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged这两个一定不能少
资源放在:https://download.csdn.net/download/lw8014/84398275
https://download.csdn.net/download/lw8014/84398275