说真的,passwordbox 没有真正的 mvvm 解决方案,像没有 mvvm 一样保持安全。
在我看来在 mvvm 构建的应用程序中使用密码框的最佳/最不坏的方法是通过命令参数将整个密码框控制权交给您的视图模型(例如在登录/注册按钮)并将其交给您的内部类/服务,直到您真的需要为网络服务或类似的东西获取密码。
它肯定会破坏 mvvm 模式,因为您的视图模型知道控件,但它是最安全的解决方案,可以在大多数 mvvm 构建的应用程序中轻松实现。
编辑:
如果需要,您可以通过命令参数轻松传递两个或多个密码框。 (就像注册对话框一样,用户必须输入两次密码并且必须匹配。)这可以通过命令参数的 MultiBinding 来完成:
<Button.CommandParameter>
<MultiBinding Converter="{local:ItemsToListConverter}">
<Binding ElementName="nameOfPasswordBox1" />
<Binding ElementName="nameOfPasswordBox2" />
</MultiBinding>
</Button.CommandParameter>
转换器只是将所有值作为新列表返回:
[MarkupExtensionReturnType(typeof(ItemsToListConverter))]
public class ItemsToListConverter : MarkupExtension, IMultiValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values == null) return values;
return values.ToList();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
在您的 ViewModel 中,您有普通的 ICommand,它以对象为参数。您可以在那里将该对象转换为 PasswordBoxes 列表。 (在我的示例中,它是一个带有方法“Register”的 RegisterCommand):
private void Register(object obj)
{
IEnumerable<PasswordBox> passwordBoxes = (obj as IList).Cast<PasswordBox>();
//Do whatever with your PasswordBoxes =)
}