문제
방금 MV-VM 및 WPF를 시작하고 일부 구속력 문제를 이해하는 데 문제가 있습니다.
로그인 페이지가 있습니다 ComboBox
그리고 a PasswordBox
. 그만큼 ComboBox
이렇게 보인다 :
<ComboBox Name="comboBox1" SelectedItem="{Binding Path=Username}">
이것은 잘 작동합니다. 내 가치는 매번 업데이트됩니다. SelectedItem
변경 사항 ComboBox
!
내 뷰 모델에는 an이 있습니다 ICommand
이 메소드를 사용하여 로그인 버튼이 활성화되었는지 확인합니다.
public bool CanLogin()
{
return !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password);
}
그래서 내 문제는 내가 없다는 것입니다 PasswordBox
ViewModel의 비밀번호 속성에 묶여 있으므로 언제 업데이트되었는지 알 수 없습니다.
그래서 어떻게 가치를 얻을 수 있습니까? PasswordBox
내 뷰 모델에? 내가 읽은 모든 것은 단지 묶지 않는다 PasswordBox
보안상의 이유로. Canlogin ()에서 암호 제한을 단순히 제거하지만 계정 서비스로 전달하려면 값이 필요합니다.
해결책
흥미로운.
이 블로그 게시물을보고 도움이되는지 확인하십시오.http://blog.functionalfun.net/2008/06/wpf-passwordbox-binding.html
분명히 링크는 이제 죽었으므로 여기에 원래 솔루션이 있습니다 (찾았습니다. 여기):
첨부 된 속성을 사용하여 다음과 같은 도우미를 만들 수 있습니다.
public static class PasswordHelper { public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordHelper), new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged)); public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, Attach)); private static readonly DependencyProperty IsUpdatingProperty = DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), typeof(PasswordHelper)); public static void SetAttach(DependencyObject dp, bool value) { dp.SetValue(AttachProperty, value); } public static bool GetAttach(DependencyObject dp) { return (bool)dp.GetValue(AttachProperty); } public static string GetPassword(DependencyObject dp) { return (string)dp.GetValue(PasswordProperty); } public static void SetPassword(DependencyObject dp, string value) { dp.SetValue(PasswordProperty, value); } private static bool GetIsUpdating(DependencyObject dp) { return (bool)dp.GetValue(IsUpdatingProperty); } private static void SetIsUpdating(DependencyObject dp, bool value) { dp.SetValue(IsUpdatingProperty, value); } private static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { PasswordBox passwordBox = sender as PasswordBox; passwordBox.PasswordChanged -= PasswordChanged; if (!(bool)GetIsUpdating(passwordBox)) { passwordBox.Password = (string)e.NewValue; } passwordBox.PasswordChanged += PasswordChanged; } private static void Attach(DependencyObject sender, DependencyPropertyChangedEventArgs e) { PasswordBox passwordBox = sender as PasswordBox; if (passwordBox == null) return; if ((bool)e.OldValue) { passwordBox.PasswordChanged -= PasswordChanged; } if ((bool)e.NewValue) { passwordBox.PasswordChanged += PasswordChanged; } } private static void PasswordChanged(object sender, RoutedEventArgs e) { PasswordBox passwordBox = sender as PasswordBox; SetIsUpdating(passwordBox, true); SetPassword(passwordBox, passwordBox.Password); SetIsUpdating(passwordBox, false); } }
그걸 써:
<PasswordBox w:PasswordHelper.Attach="True"
w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}"
Width="100"/>
다른 팁
나는 요점을 올렸다 여기 바인딩 가능한 비밀번호 상자입니다.
제휴하지 않습니다 StackOverflow