【问题标题】:MVVM Passwordbox with data template带有数据模板的 MVVM 密码框
【发布时间】:2017-05-08 08:53:04
【问题描述】:

如何从密码箱中获取密码?
1。我不想违反 MVVM 模式(至少不多)
2。我不能使用代码隐藏,因为我使用数据模板来创建我的视图。我必须使用它们,因为我正在制作包含页面的窗口。因此,我将页面视图模型存储在我的窗口视图模型中,并在我需要导航到其中任何一个时将它们附加到 ContentControl。当我在他们之间分享我的模型时,我必须这样做。
3。我也想要一定程度的安全性,所以我不想“破解”密码框以绑定密码属性。
这不可能吗?

我不使用任何 MVVM 框架。而且我知道有很多关于密码框和 MVVM 的问题,但没有一个涉及数据模板。更重要的是,我的视图中有 2 个密码框(第二个用于“确认密码”),我不能将 PasswordBox 作为 CommandParameter 传递(因为我有 2 个密码框并且传递包含它们的元素绝对是野蛮的)

【问题讨论】:

    标签: wpf mvvm datatemplate passwordbox


    【解决方案1】:

    说真的,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 =)
    }
    

    【讨论】:

    • 我同意你的观点,但在我的情况下我必须传递 2 个密码框...而且我不能只传递一个密码框并预先在代码隐藏中验证它们的匹配,因为没有代码隐藏当我使用数据模板时(再次 mvvm '强制'我进入这个)
    • 编辑了我的答案,我有完全相同的场景 =)
    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多