我已经阅读了几篇关于如何使用附加属性绑定到WPF中的PasswordBox值的文章。但是,每篇文章都引用了.NET文档,该文档解释了为什么PasswordBox首先不能绑定。
我不认为自己是安全专家,但我认为微软的某个人知道他们在做什么,我不应该试图撤消它。
所以,相反,我提出了自己的解决方案。
public class LoginViewModel
{
// other properties here
public PasswordBox Password
{
get { return m_passwordBox; }
}
// Executed when the Login button is clicked.
private void LoginExecute()
{
var password = Password.SecurePassword;
// do more stuff...
}
}
然后,在我的XAML中,我只是通过将密码字段绑定到ContentPresenter
来呈现PasswordBox。
所以我的问题是......这样做有问题吗?我意识到我通过让实际控件出现在我的ViewModel中来某种方式打破MVVM,但至少这似乎比取消保护密码字段更正确。
如果这确实是一个问题,是否有人提出了一个不涉及使用附加属性并将密码存储在ViewModel中的解决方案?
谢谢! -J
答案 0 :(得分:6)
至少在登录时需要将密码存储在VM中有什么问题?你是正确的,根据MVVM模式,VM不应该像PasswordBox那样引用控件。
在视图中,为PasswordChanged事件添加处理程序。在处理程序中,使用passwordbox的SecurePassword更新VM中的SecureString属性。
答案 1 :(得分:2)
这只是一种意见,希望它可以帮到你。
在你的代码背后考虑这个:
void loginButton_Clicked(object s, EventArgs e)
{
myViewModel.Password = txPwdBox.Password;
myViewModel.Login();
}
答案 2 :(得分:0)
我喜欢你的主意。
是的,您违反了ViewModel的最佳做法,但
在这里打破View / ViewModel障碍对你来说是一个问题取决于为什么你首先使用ViewModel(例如,关注点分离,单元测试,可重用性),所以我无法回答这个问题。
答案 3 :(得分:0)
我的2美分:
在视图模型中加密密码,使用附加的属性,并使用ValueConverter加密/解密密码。即使有人使用snoop,他们所看到的只是加密数据。
让我们知道哪种情况最适合您的情况