use*_*083 4 wpf xaml mvvm c#-4.0
我正在创建一个包含WPF中的用户名,密码框和确认密码框的注册表单.
我打算IDataErrorInfo
在视图模型上使用验证,但由于PasswordBox的Password
属性不是DependencyProperty(由于安全原因).
我不想使用AttachedProperty,所以我能想到的唯一选择是使用后面的代码将密码值传递给ViewModel,但我不知道如何引发这样的验证错误.
如何在没有绑定的情况下为PasswordBox控件引发验证?
我可以使用验证规则而不是IDataErrorInfo(如果需要).
小智 6
最好回答迟到而不是:)
如果要避免在运行时将密码作为纯文本显示在内存中,则选择使用PasswordBox.SecurePassword属性.并且您可能仍希望对输入的值进行一些验证,例如检查它是否足够长(SecureString类具有Length属性).在这种情况下,我应用ErrorTemplate的最简单方法是在viewmodel中使用额外的属性并绑定PasswordBox的任何其他属性.一般来说,我更喜欢使用Tag属性,但任何废物都适合.
所以,代码看起来像
视图模型:
public class MyViewModel : ViewModelBase, IDataErrorInfo
{
// some code skipped
private SecureString password;
public SetPassword(SecureString pwd)
{
password = pwd.Copy();
password.MakeReadOnly();
OnPropertyChanged("PasswordExtra");
}
public bool PasswordExtra
{
get { return false; }
}
#region IDataErrorInfo
// public string Error realization skipped
public string this[string propertyName]
{
get
{
if (propertyName == "PasswordExtra")
{
if (password.Length < 8)
return "Password is too short";
}
return null;
}
}
#endregion IDataErrorInfo
}
Run Code Online (Sandbox Code Playgroud)
视图:
private void onPasswordChanged(object sender, RoutedEventArgs e)
{
(DataContext as MyViewModel).SetPassword((sender as PasswordBox).SecurePassword);
}
Run Code Online (Sandbox Code Playgroud)
XAML:
<PasswordBox
Tag="{Binding PasswordExtra, ValidatesOnDataErrors=True}"
PasswordChanged="onPasswordChanged"/>
Run Code Online (Sandbox Code Playgroud)