如何从密码箱获取密码?
1.我不想违反MVVM模式(至少不会太多)
2.我不能使用代码隐藏,因为我使用数据模板来创建我的视图。我必须使用它们,因为我正在制作包含页面的窗口。所以我将页面viewmodels存储在我的窗口viewmodel中,并在我需要导航到它们中的任何一个时将它们附加到ContentControl。我必须这样做,因为我在他们之间分享我的模型。
3.我也想要一些安全级别,所以我不想为了绑定密码属性而“破解”密码框。
这是不可能的吗?
我不使用任何MVVM框架。我知道有很多关于密码箱和MVVM的问题,但他们都没有处理数据模板。更重要的是,我在我的视图中有2个密码箱(第二个用于“确认密码”),我不能仅仅将PasswordBox作为CommandParameter传递(因为我有2个密码箱和包含它们的传递元素是绝对野蛮的)带数据模板的MVVM密码箱
1
A
回答
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 =)
}
相关问题
- 1. MVVM的密码箱
- 2. 带锁箱的数字签名密钥
- 3. MVVM绑定密码
- 4. 带密钥库证书的ARM模板
- 5. 带面板数据的ARIMA建模
- 6. Laravel密码恢复模板
- 7. 带MVVM模式的数字文本框
- 8. MVVM数据模板和非直接数据映射
- 9. 带有数据绑定的模板模板
- 10. 带数据库的WPF MVVM示例
- 11. Laravel 5.3将数据传递给密码重置模板失败
- 12. 带子窗口和共享数据的Silverlight MVVM模式
- 13. 带有上下文的Android MVVM数据模型
- 14. WPF MVVM密码框绑定
- 15. 基于MVVM模板的XAML数据绑定
- 16. 带有更新源触发器的WPF密码箱
- 17. WPF MVVM数据模型
- 18. 与错号码的模板参数模板的模板参数
- 19. kendo mvvm模板内绑定
- 20. 带密码的密码重置laravel 4.2
- 21. 带模板参数的模板函数的类型推断
- 22. 造型WPF密码箱
- 23. WPF:在样式和/或数据模板(MVVM)中绑定命令?
- 24. Silverlight 5隐式数据模板和ContentPresenter绑定MVVM
- 25. 带默认参数的C++模板模板参数
- 26. 带有模板化参数的C++函数模板
- 27. 带模板参数或类型名称的模板函数
- 28. 带有模板化参数的模板化函数
- 29. 存储模板集装箱
- 30. 带模板的类模板专业化
我同意你的观点,但我必须要通过2个passwordboxes在我的情况,我还不能老是只传递一个并验证其事先在代码隐藏中匹配,因为在我使用数据模板时没有代码隐藏(再次mvvm'强制'我进入这个) – Bibipkins
编辑我的答案,我有完全相同的场景=) –