如何从密码框中获取密码?
1。我不想违反MVVM模式(至少不是太多(
2。我无法使用代码,因为我使用数据模板来创建视图。我必须使用它们,因为我正在制作包含页面的窗口。因此,我将页面ViewModels存储在我的窗口视图模型中,并在需要导航到任何一个时将它们连接到ContentControl。当我在它们之间分享我的模型时,我必须这样做。
3。我也需要一定程度的安全性,因此我不想"入侵"密码框来绑定密码属性。
这是不可能的吗?
我不使用任何MVVM-FRAMEWORKS。而且我知道有关密码框和MVVM有很多问题,但它们都不涉及数据模板。更重要的是,我的视图中有2个密码框(第二个"确认密码"(,我不能将密码盒作为CommandParameter传递(因为我有2个,并且包含它们的元素绝对是野蛮的(
认真,没有用于密码框的实际MVVM解决方案,该解决方案像没有MVVM一样维护安全性。
在我的看法中注册按钮(并将其交给您的内部类/服务,直到您确实需要获取Web服务或类似内容的密码为止。
它肯定会破坏MVVM模式,因为您的ViewModel知道了一个控件,但它是最安全的解决方案,可以在大多数MVVM构建的应用程序中轻松实现。
编辑:如果需要,您可以通过命令参数轻松传递两个或多个密码框。(例如,对于寄存器对话框,用户必须两次键入密码,并且必须匹配。(可以通过命令参数的多键操作:
<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将对象作为参数。您可以在那里将该对象投入到密码盒列表中。(在我的示例中
private void Register(object obj)
{
IEnumerable<PasswordBox> passwordBoxes = (obj as IList).Cast<PasswordBox>();
//Do whatever with your PasswordBoxes =)
}