c# - MVVM、行为和密码框
问题描述
我搜索了从 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 中有两个独立的类:一个来自上面的代码,第二个 Class 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 类中的密码值获取到 Main MainLoginFormViewModel 中?好像我错过了什么,但我不明白是什么......
PS我知道有另一种方法可以解决MVVM中的PasswordBox问题,比如将整个密码框控件传递给viewmodel,但这样我就不能从VM设置密码(让应用程序“记住”应用程序启动时的最后一个密码)
解决方案
刚刚将类 PasswordBehavior 移到后面的视图代码中并在 VM 中创建属性“密码”:
private string _Password;
public string Password
{
get { return _Password; }
set { _Password = value; NotifyPropertyChanged("Password"); }
}
一切都按预期工作。
推荐阅读
- r - 使用 foreach 和 doMC 时如何控制发送给工作人员的内容
- reactjs - 使用 Reach-Router、React-Transition-Group 和 GSAP 的页面转换问题?
- neo4j - 在所有元素中有效地找到属性的最大值
- elasticsearch - 时间序列 AVG 聚合
- python - 如何正确存储循环迭代的中间结果?
- scala - 如何从 Scala 连接到 Exasol?
- c# - 向上移动目录字符串是否有常量
- sql-server - 如何在动态插入查询的存储过程中将参数作为列表传递
- sql - 用尾随和前导空格突出显示行
- angular - 如何通过 Angular 编译文件查找错误?