DataServices 现场调试OK

This commit is contained in:
2025-11-26 16:46:48 +08:00
parent 979afae645
commit 010272aa0b
31 changed files with 1866 additions and 267 deletions

View File

@@ -0,0 +1,73 @@
using System.Windows;
using System.Windows.Controls;
namespace FATrace.WPLApp.Utils
{
/// <summary>
/// 允许将 PasswordBox 的 Password 与 ViewModel 绑定
/// 用法:
/// <PasswordBox utils:PasswordBoxAssistant.BindPassword="True"
/// utils:PasswordBoxAssistant.BoundPassword="{Binding Password, Mode=TwoWay}" />
/// </summary>
public static class PasswordBoxAssistant
{
public static readonly DependencyProperty BoundPasswordProperty =
DependencyProperty.RegisterAttached("BoundPassword", typeof(string), typeof(PasswordBoxAssistant), new PropertyMetadata(string.Empty, OnBoundPasswordChanged));
public static readonly DependencyProperty BindPasswordProperty =
DependencyProperty.RegisterAttached("BindPassword", typeof(bool), typeof(PasswordBoxAssistant), new PropertyMetadata(false, OnBindPasswordChanged));
private static readonly DependencyProperty IsUpdatingProperty =
DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), typeof(PasswordBoxAssistant));
public static string GetBoundPassword(DependencyObject dp) => (string)dp.GetValue(BoundPasswordProperty);
public static void SetBoundPassword(DependencyObject dp, string value) => dp.SetValue(BoundPasswordProperty, value);
public static bool GetBindPassword(DependencyObject dp) => (bool)dp.GetValue(BindPasswordProperty);
public static void SetBindPassword(DependencyObject dp, bool value) => dp.SetValue(BindPasswordProperty, value);
private static bool GetIsUpdating(DependencyObject dp) => (bool)dp.GetValue(IsUpdatingProperty);
private static void SetIsUpdating(DependencyObject dp, bool value) => dp.SetValue(IsUpdatingProperty, value);
private static void OnBoundPasswordChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
{
if (dp is PasswordBox passwordBox)
{
passwordBox.PasswordChanged -= HandlePasswordChanged;
if (!(bool)GetIsUpdating(passwordBox))
{
passwordBox.Password = e.NewValue?.ToString() ?? string.Empty;
}
passwordBox.PasswordChanged += HandlePasswordChanged;
}
}
private static void OnBindPasswordChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
{
if (dp is PasswordBox passwordBox)
{
bool wasBound = (bool)(e.OldValue ?? false);
bool needBind = (bool)(e.NewValue ?? false);
if (wasBound)
{
passwordBox.PasswordChanged -= HandlePasswordChanged;
}
if (needBind)
{
passwordBox.PasswordChanged += HandlePasswordChanged;
}
}
}
private static void HandlePasswordChanged(object sender, RoutedEventArgs e)
{
if (sender is PasswordBox passwordBox)
{
SetIsUpdating(passwordBox, true);
SetBoundPassword(passwordBox, passwordBox.Password);
SetIsUpdating(passwordBox, false);
}
}
}
}