我搜索了从PasswordBox设置和检索密码字符串的MVVM解决方案。 我使用System.Windows.Interactivity中的Behavior类找到的解决方案。 这是代码: 查看:
<PasswordBox Name="pass" >
<i:Interaction.Behaviors>
<vm:PasswordBehavior Password="{Binding Password, Mode=TwoWay}" />
</i:Interaction.Behaviors>
</PasswordBox>
这是ViewModel:
public class PasswordBehavior : Behavior<PasswordBox>
{
public static readonly DependencyProperty PasswordProperty =
DependencyProperty.Register("Password", typeof(string), typeof(PasswordBehavior), new PropertyMetadata(default(string)));
private bool _skipUpdate;
public string Password
{
get { return (string)GetValue(PasswordProperty); }
set { SetValue(PasswordProperty, value); }
}
protected override void OnAttached()
{
AssociatedObject.PasswordChanged += PasswordBox_PasswordChanged;
}
protected override void OnDetaching()
{
AssociatedObject.PasswordChanged -= PasswordBox_PasswordChanged;
}
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (e.Property == PasswordProperty)
{
if (!_skipUpdate)
{
_skipUpdate = true;
AssociatedObject.Password = e.NewValue as string;
_skipUpdate = false;
}
}
}
private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
_skipUpdate = true;
Password = AssociatedObject.Password;
_skipUpdate = false;
}
}
这是可行的!我可以在VM中看到密码,但这是另一个问题:现在我在VM中有两个分离的类:一个是上面的代码,另一个是MainLoginFormViewModel:BaseViewModel,其中包含所有其他属性,例如用户名和用于检查连接的命令,等等。
namespace MyApp.ViewModels
{
public class PasswordBehavior : Behavior<PasswordBox>
{
...
}
class MainLoginFormViewModel : BaseViewModel
{
public MainWindowViewModel()
{
sStatus = "Hello";
GetLoginData();
}
private string _sStatus;
public string sStatus
{
get { return _sStatus; }
set { _sStatus = value; NotifyPropertyChanged("sStatus"); }
}
private string _sServer;
public string sServer
{
get { return _sServer; }
set { _sServer = value; NotifyPropertyChanged("sServer"); }
}
private string _sName;
public string sName
{
get { return _sName; }
set { _sName = value; NotifyPropertyChanged("sName"); }
}
//...
}
}
我不能混合使用这两种情况,因为其中一种是嵌套在BaseViewModel中,需要实现INotifyPropertyChanged,而第二种是嵌套在Behavior中,这也是我需要的。
如何使用授权逻辑将密码值从类PasswordBehavior获取到MainMainLoginFormViewModel中?似乎我错过了某事,但是我不明白是什么...。
P.S。我知道还有另一种解决MVVM中PasswordBox问题的方法,例如将整个passwordbox控件传递到viewmodel中,但是那样我无法从VM设置密码(使应用“记住”应用启动时的最后一个密码)
答案 0 :(得分:0)
只需将类PasswordBehavior移到后面的查看代码中,并在VM中创建属性“ Password”:
private string _Password;
public string Password
{
get { return _Password; }
set { _Password = value; NotifyPropertyChanged("Password"); }
}
所有工作都按预期进行。