WPF PasswordBox 데이터 바 인 딩 방법

본 고 는 PasswordBox 가 데이터 바 인 딩 을 하 는 방법 을 소개 한다본문 참조 링크
본 논문 의 전체 예시 절 차 는 4.567915 참조.
문제 설명
Password Box 의 Password 속성 은 속성 에 의존 하 는 것 이 아니 므 로 데이터 바 인 딩 을 할 수 없습니다.
해결 방법
이 문제 의 해결 방법 은 여러 가지 가 있 는데 본 고 는 부가 속성 을 추가 하여 이 문 제 를 해결 하 는 방법 을 소개 한다.
추가 속성 은 하나의 속성 이 원래 특정한 대상 에 속 하지 않 지만 특정한 수요 가 이 대상 에 부가 되 기 때문에 추가 속성 을 통 해 속성 과 숙주 를 결합 시 키 는 목적 을 실현 할 수 있다 는 것 을 말한다.부가 속성 은 본질 적 으로 속성 에 의존 하 는 것 이다.다만 속성 포장 기와 등록 할 때 차이 가 있다.등록 부가 속성 은 RegisterAttached 방법 을 사용 하고 등록 의존 속성 은 Register 방법 을 사용 합 니 다.이 두 가지 방법의 매개 변 수 는 차이 가 크 지 않 습 니 다.
먼저 PasswordBoxBinding Helper 클래스 를 추가 합 니 다.이 클래스 는 추가 속성(snippet:propa+두 번 tab)을 포함 합 니 다.이 속성 을 설정 한 Property Changed Callback 을 통 해 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       
<Window ...
        xmlns:local="clr-namespace:PasswordBoxBinding"
        Title="PasswordBoxBinding" Height="300" Width="450" WindowStartupLocation="CenterScreen">

    <Grid>
        <StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
            <PasswordBox MinWidth="200" Height="30" BorderBrush="LightGray" BorderThickness="2"
                         local:PasswordBoxBindingHelper.PasswordContent="{Binding Password,Mode=TwoWay}"/>
            <Rectangle Width="20"/>
            <Button Width="80" Height="30" Content="    " Command="{Binding ClickedCommand}"/>
        </StackPanel>
    </Grid>
</Window>

//xaml.cs      
public MainWindow()
{
    InitializeComponent();
    this.DataContext = new MainWindowViewModel();
}
마지막 으로 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<object> ExecuteAction { get; set; }
    public Func<object, bool> CanExecuteAction { get; set; }
}
이상 은 WPF PasswordBox 에서 데이터 바 인 딩 을 하 는 방법 에 대한 상세 한 내용 입 니 다.WPF PasswordBox 데이터 바 인 딩 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기