14

の検証を行おうとしていPasswordBoxます。検証を行うために、このリンクをたどりました。これは、で検証する方法を示していますTextBox

問題は付属していPasswordBoxesます。Passwordセキュリティ上の理由からバインドできないため、このリンクに従ってバインドを作成しようとしました ( CodeProject ユーザー向けにここでも説明されています)。

どうやら、素晴らしい!私PasswordBoxをそのPasswordプロパティにバインドできるので、検証にバインドできます。しかし、それは私を無視します...

これはTextBox私が使用し、正常に動作する定期的なものです:

<local:ErrorProvider Grid.Column="1" Grid.Row="2" >
    <TextBox Width="160" 
          HorizontalAlignment="Left" 
           Name="textBoxUserPass" 
           Text="{Binding Path=Password, UpdateSourceTrigger=Explicit}" />
 </local:ErrorProvider>

そして、これはPasswordBox私がシミュレートしようとしたものです:

<local:ErrorProvider Grid.Column="1" Grid.Row="2" >
      <PasswordBox Width="160"
          HorizontalAlignment="Left"
          Name="textBoxUserPass"
          local:PasswordBoxAssistant.BindPassword="True"
          local:PasswordBoxAssistant.BoundPassword="{Binding Path=Password, UpdateSourceTrigger=Explicit}" />
 </local:ErrorProvider>

これは私がBindingExpressionfor eachを取得する方法ですTextBox:

BindingExpression beUserName = textBoxUserName.GetBindingExpression(TextBox.TextProperty);
if (beUserName != null) beUserName.UpdateSource();

そして、これは私がそれを取得する方法ですPasswordBox:

BindingExpression bePassword = textBoxUserPass.GetBindingExpression(PasswordBoxAssistant.BoundPassword);
if (bePassword != null) bePassword.UpdateSource();

間違いを犯した場合 (Validation クラスで定義)、これを行うと:

if (!beUserName.HasError && !bePassword.HasError)

エラー検証に応じて、それぞれがまたは偽BindingExpressionとなるはずです。しかし、私にとっては価値がありません...何か考えはありますか? PasswordBox

4

4 に答える 4

12

Try setting ValidatesOnDataErrors=True and ValidatesOnExceptions=True on your binding:

<PasswordBox ...
   local:PasswordBoxAssistant.BoundPassword="{Binding Path=Password,
      UpdateSourceTrigger=Explicit, 
      ValidatesOnDataErrors=True, 
      ValidatesOnExceptions=True}"
/>
于 2013-02-27T14:50:17.303 に答える
2

私が覚えている限りでは、PasswordBox に検証を追加する唯一の方法は、SecurePassword のバインド プロパティのセッターで新しい ValidationException をスローすることです。PasswordBoxAssistant は、これには役立ちません。

于 2013-02-27T13:49:10.637 に答える
2

途中で「安全でない」文字列を使用しない別の解決策は、次のようなウィンドウ コードを適応させることです。

IDataErrorInfoを使用して WPF 検証を行う、次のような MVVM オブジェクトがあるとします。

public class MyObject : INotifyPropertyChanged, IDataErrorInfo
{
    ...
    public SecureString SecurePassword
    {
        get
        { ... }
        set
        {
            ...
            OnPropertyChanged("SecurePassword");
        }
    }

    ...

    string IDataErrorInfo.Error { get { return Validate(null); } }
    string IDataErrorInfo.this[string columnName] { get { return Validate(columnName); } }

    private string Validate(string memberName)
    {
        string error = null;
        ...
        if (memberName == "SecurePassword" || memberName == null)
        {
            // this is where I code my custom business rule
            if (SecurePassword == null || SecurePassword.Length == 0)
            {
                error = "Password must be specified.";
            }
        }
        ...
        return error;
    }

}

そして、次のような PasswordBox を持つ Window Xaml:

<PasswordBox Name="MyPassword" PasswordChanged="MyPassword_Changed" ... />

次に、このような対応する Window コードが PasswordBox バインディングをトリガーします。

// add a custom DependencyProperty
public static readonly DependencyProperty SecurePasswordProperty =
    DependencyProperty.RegisterAttached("SecurePassword", typeof(SecureString), typeof(MyWindow));

public MyWindow()
{
    InitializeComponent();

    DataContext = myObject; // created somewhere

    // create a binding by code
    Binding passwordBinding = new Binding(SecurePasswordProperty.Name);
    passwordBinding.Source = myObject;
    passwordBinding.ValidatesOnDataErrors = true;
    // you can configure other binding stuff here
    MyPassword.SetBinding(SecurePasswordProperty, passwordBinding);
}

private void MyPassword_Changed(object sender, RoutedEventArgs e)
{
    // this should trigger binding and therefore validation
    ((MyObject)DataContext).SecurePassword = MyPassword.SecurePassword;
}
于 2014-05-15T17:01:31.723 に答える