2012-12-24 26 views
2

PasswordBox元素的Password属性不是DependencyObject,因此无法绑定(没有Text属性)。通过将消息附加到PasswordChanged事件,传递消息源并在视图模型中抓取消息,可以在用户类型中捕获密码。然而,缺乏约束意味着没有机会设置ValidatesOnDataErrors=True,因此IDataErrorInfo方法从不会调用,意味着从不激活任何错误模板。任何人都知道如何解决此问题?也就是说,是否有另一种方法让元素调用IDataErrorInfo索引器的视图模型的调用?PasswordBox验证

一个合法的问题可能是您为什么要验证密码。

两个原因:

1)为了让用户知道需要密码。 2)让用户知道密码和密码确认是否相同。

+5

http://stackoverflow.com/questions/8942259/error-handling-in-wpf-passwordbox?rq=1 – Nahum

回答

0

这里也是一个很好的例子:http://wpftutorial.net/PasswordBox.html 但是,如果你这样做的话,密码将作为纯文本存储在内存中。

也许最好将示例中的附加属性“Password”更改为“IsEmpty”和“PasswordHash”之类的内容。

0

除了以下Alex的回答,我也使用了本文中的信息;

http://wpftutorial.net/PasswordBox.html

如果我做了,允许验证以下;

XAML:

<Grid Grid.Row="2" Grid.Column="1"> 
    <TextBox x:Name="plain1" Text="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True,NotifyOnValidationError=True}" Visibility="Hidden" /> 
    <PasswordBox x:Name="PasswordHelperBox" w:PasswordHelper.Attach="True" w:PasswordHelper.Password="{Binding Text, ElementName=plain1, Mode=TwoWay}" TabIndex="2" Margin="0,2,30,2"/> 
</Grid> 

其中, “密码” 是绑定到该属性。

助手类;

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); 
    } 
} 
+3

所以你是说目前根本用于验证密码箱,并把一个无解验证后,密码框周围是否有红色边框?我不确定人们为什么要解决密码箱破解问题。我的店里肯定不允许这种解决方案。 – James

+1

要了解为什么这是一个糟糕的主意,请阅读以下文章:http://gigi.nullneuron.net/gigilabs/security-risk-in-binding-wpf-passwordbox-password/它通过本教程提供的间接引用PGallagher,但它不能强调。 – Ewoud