WPF设计标准学习记录23

发布于:2025-04-10 ⋅ 阅读:(33) ⋅ 点赞:(0)

public static int GetMyProperty(DependencyObject obj)
{
    return (int)obj.GetValue(MyPropertyProperty);
}
 
public static void SetMyProperty(DependencyObject obj, int value)
{
    obj.SetValue(MyPropertyProperty, value);
}
 
// Using a DependencyProperty as the backing store for MyProperty.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.RegisterAttached(
        "MyProperty", 
        typeof(int), 
        typeof(ownerclass), 
        new PropertyMetadata(0));

	public class ObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
 
    public void RaisePropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
public class Person : ObservableObject
{
    private string username;
    public string UserName
    {
        get { return username; }
        set { username = value;RaisePropertyChanged(); }
    }
 
    private string password;
    public string Password
    {
        get { return password; }
        set { password = value; RaisePropertyChanged(); }
    }
}

	public class MainViewModel : ObservableObject
{
    private Person person = new Person();
    public Person Person
    {
        get { return person; }
        set { person = value;RaisePropertyChanged(); }
    }
}
 
<Window.DataContext>
    <local:MainViewModel/>
</Window.DataContext>
	public class PasswordBoxHelper
{
    public static string GetPassword(DependencyObject obj)
    {
        return (string)obj.GetValue(PasswordProperty);
    }
 
    public static void SetPassword(DependencyObject obj, string value)
    {
        obj.SetValue(PasswordProperty, value);
    }
 
    public static readonly DependencyProperty PasswordProperty =
        DependencyProperty.RegisterAttached(
            "Password", typeof(string), typeof(PasswordBoxHelper), 
            new PropertyMetadata("",
                new PropertyChangedCallback(OnPasswordPropertyChangedCallback)));
 
    private static void OnPasswordPropertyChangedCallback(
        DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if(d is PasswordBox passwordBox)
        {
            passwordBox.PasswordChanged -= PasswordBox_PasswordChanged;
            passwordBox.PasswordChanged += PasswordBox_PasswordChanged;
        }
    }
 
    private static void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
    {
        if(sender is PasswordBox passwordBox)
        {
            SetPassword(passwordBox, passwordBox.Password);
        }
    }
}
/// <summary>
/// PasswordBox密码绑定辅助类(解决原生Password属性不支持绑定的问题)
/// [!] 当前实现存在安全性缺陷(未使用SecureString)
/// </summary>
public class PasswordBoxHelper 
{
    /// <summary>
    /// 获取附加密码值(从DependencyObject解析)
    /// [!] 未做类型安全验证(可能抛出InvalidCastException)
    /// </summary>
    public static string GetPassword(DependencyObject obj)
    {
        return (string)obj.GetValue(PasswordProperty);
    }
 
    /// <summary>
    /// 设置附加密码值(通过DependencyObject存储)
    /// [!] 未实现输入加密处理 
    /// </summary>
    public static void SetPassword(DependencyObject obj, string value)
    {
        obj.SetValue(PasswordProperty, value);
    }
 
    /// <summary>
    /// 密码附加属性注册(支持双向绑定)
    /// 元数据配置:
    /// - 默认值:空字符串 
    /// - 变更回调:关联PasswordBox事件 
    /// </summary>
    public static readonly DependencyProperty PasswordProperty =
        DependencyProperty.RegisterAttached(
            "Password", 
            typeof(string), 
            typeof(PasswordBoxHelper),
            new PropertyMetadata(
                string.Empty,
                new PropertyChangedCallback(OnPasswordPropertyChangedCallback)));
 
    /// <summary>
    /// 属性变更事件处理器(动态绑定PasswordChanged事件)
    /// [!] 存在事件订阅泄漏风险(未考虑控件生命周期)
    /// </summary>
    private static void OnPassw