1、新建Common文件夹,文件夹新建“PasswordHelper.cs”类。
“PasswordHelper.cs”代码如下:
using System.Windows;
using System.Windows.Controls;
namespace CourseManagement.Common
{
public class PasswordHelper
{
public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordHelper), new FrameworkPropertyMetadata("", new PropertyChangedCallback(OnPropertyChanged)));
public static string GetPassword(DependencyObject d)
{
return d.GetValue(PasswordProperty).ToString();
}
public static void SetPassword(DependencyObject d, string value)
{
d.SetValue(PasswordProperty, value);
}
public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(PasswordHelper), new FrameworkPropertyMetadata(default(bool), new PropertyChangedCallback(OnAttached)));
public static bool GetAttach(DependencyObject d)
{
return (bool)d.GetValue(AttachProperty);
}
public static void SetAttach(DependencyObject d, bool value)
{
d.SetValue(AttachProperty, value);
}
static bool _isUpdating = false;
private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
PasswordBox password = d as PasswordBox;
password.PasswordChanged -= Psssword_PasswordChanged;
if(!_isUpdating)
password.Password = e.NewValue?.ToString();
password.PasswordChanged += Psssword_PasswordChanged;
private static void OnAttached(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
PasswordBox password = d as PasswordBox;
password.PasswordChanged += Psssword_PasswordChanged;
}
private static void Psssword_PasswordChanged(object sender, RoutedEventArgs e)
{
PasswordBox passwordBox = sender as PasswordBox;
_isUpdating = true;
SetPassword(passwordBox, passwordBox.Password);
_isUpdating = false;
}
}
2、LoginView.xaml代码如下:
xmlns:common="clr-namespace:CourseManagement.Common"
<PasswordBox Grid.Row="1" Height="42" Style="{DynamicResource PasswordBoxStyle}"
FontSize="16" Foreground="#DDD"
common:PasswordHelper.Attach="True"
common:PasswordHelper.Password="{Binding LoginModel.Password}">
3、LoginViewModel.cs绑定密码
4、LoginModel.cs
5、发起通知,监听属性:
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace CourseManagement.Common
{
public class NotifyBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void DoNotify([CallerMemberName] string propName="")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
}
}
}
6、Common文件下的“CommandBase.cs”类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace CourseManagement.Common
{
public class CommandBase : ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return DoCanExecute?.Invoke(parameter) == true;
}
public void Execute(object parameter)
{
DoExecute?.Invoke(parameter);
}
public Action<object> DoExecute { get; set; }
public Func<object, bool> DoCanExecute { get; set; }
}
}
6、绑定成功: