2017-05-08 70 views
1

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

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

回答

1

严重,密码箱没有真正的mvvm解决方案,它像没有mvvm一样维护安全性。

在我看来在一个MVVM构建的应用程序的密码框中的最佳/最不坏的方法是通过commandparameter(在登录一样/注册按钮)来给整个passwordbox控制您的视图模型和把它交给你的内部类/服务,直到你真的需要为web服务或类似的东西获取密码。

它绝对会破坏mvvm模式,因为您的viewmodel知道控件,但它是最安全的解决方案,可以在大多数mvvm构建的应用程序中轻松实现。

编辑: 如果您需要,您可以通过命令参数轻松地传递两个或多个密码框。 (像一个注册对话框时,用户必须输入密码两次,他们必须匹配。)这可以通过Commandparameter的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,它需要一个对象作为参数。您可以在那里将该对象转换为密码框列表。 (在我的例子是有法“注册”一RegisterCommand):

private void Register(object obj) 
{ 
    IEnumerable<PasswordBox> passwordBoxes = (obj as IList).Cast<PasswordBox>(); 
    //Do whatever with your PasswordBoxes =) 
} 
+0

我同意你的观点,但我必须要通过2个passwordboxes在我的情况,我还不能老是只传递一个并验证其事先在代码隐藏中匹配,因为在我使用数据模板时没有代码隐藏(再次mvvm'强制'我进入这个) – Bibipkins

+0

编辑我的答案,我有完全相同的场景=) –