带有数据模板的MVVM密码框



如何从密码框中获取密码?
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 =)
}

相关内容

  • 没有找到相关文章

最新更新