WPF – PasswordBox 데이터 바인딩 방법
4176 단어 WPF 데이터 바인딩 mvvm
본고의 완전한 예시 절차는 GitHub.
문제 설명
PasswordBox의 Password 속성은 종속 속성이 아니기 때문에 데이터 바인딩을 할 수 없습니다.
해결책
이 문제의 해결 방법은 여러 가지가 있는데 본고는 어떻게 부가 속성을 첨가하여 이 문제를 해결하는지 소개한다.
부가 속성이란 하나의 속성은 본래 특정한 대상에 속하지 않지만 특정한 수요가 이 대상에 부가되기 때문에 부가 속성을 통해 속성을 숙주와 결합시키는 목적을 실현할 수 있다.부가 속성은 본질적으로 속성에 의존하는 것이다. 단지 속성 포장기와 등록할 때 차이가 있을 뿐이다.등록 추가 속성은 Register Attached 메소드를 사용하고, 등록 종속성 메소드는 Register 메소드를 사용하며, 두 메소드의 매개변수 차이는 크지 않습니다.
우선 PasswordBoxBindingHelper 클래스를 추가합니다. 이 클래스는 추가 속성 (snippet:propa+두 번tab) 을 포함하고, 이 속성을 설정한PropertyChangedCallback을 통해 PasswordBox에 알림을 변경합니다.Password, PasswordBox를 추가합니다.PasswordChanged 이벤트에 대한 응답은 PasswordBox에 응답합니다.Password 변경 사항이 추가 속성이 있으면 데이터 귀속을 진행할 수 있습니다.
public static string GetPasswordContent(DependencyObject obj) => (string)obj.GetValue(PasswordContentProperty);
public static void SetPasswordContent(DependencyObject obj, string value) => obj.SetValue(PasswordContentProperty, value);
public static readonly DependencyProperty PasswordContentProperty =
DependencyProperty.RegisterAttached("PasswordContent", typeof(string), typeof(PasswordBoxBindingHelper),
new PropertyMetadata(string.Empty, OnPasswordContentPropertyChanged));
private static void OnPasswordContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var box = d as PasswordBox;
box.PasswordChanged -= OnPasswordChanged;
var password = (string)e.NewValue;
if (box != null && box.Password != password)
box.Password = password;
box.PasswordChanged += OnPasswordChanged;
}
private static void OnPasswordChanged(object sender, RoutedEventArgs e)
{
var box = sender as PasswordBox;
SetPasswordContent(box, box.Password);
}
그런 다음 View에서 이 추가 속성을 사용하여 데이터를 바인딩합니다. 이 예에서는 주 창에 PasswordBox 컨트롤과 Button 버튼이 포함되어 있습니다.
// xaml
最后创建ViewModel进行逻辑处理:
// ViewModel
public class MainWindowViewModel : INotifyPropertyChanged
{
public string Password
{
get => _password;
set
{
_password = value;
OnPropertyChanged();
}
}
public DelegateCommand ClickedCommand => _clickedCommand ?? (_clickedCommand = new DelegateCommand { ExecuteAction = OnClicked });
// CallerMemberName ,
public void OnPropertyChanged([CallerMemberName] string name = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
private void OnClicked(object o) => MessageBox.Show($"password: {Password}");
public event PropertyChangedEventHandler PropertyChanged;
private DelegateCommand _clickedCommand;
private string _password;
}
// ICommand
public class DelegateCommand : ICommand
{
public bool CanExecute(object parameter) => CanExecuteAction?.Invoke(parameter) ?? true;
public void Execute(object parameter) => ExecuteAction?.Invoke(parameter);
public event EventHandler CanExecuteChanged;
public Action