WPF PasswordBox 데이터 바 인 딩 방법
4939 단어 WPFPasswordBox데이터 바 인 딩
본 논문 의 전체 예시 절 차 는 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 데이터 바 인 딩 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MaterialDesign의 ComboBox HasClearButton 크기 변경WPF MaterialDesign은 편리하지만 때로는 표시가 너무 크거나 약간 사용하기 쉽습니다. ComboBox를 사용할 때 선택한 버튼을 지우려면 지우기 버튼을 표시할 수 있습니다. 아래와 같은 표시가 됩니다 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.