WPF数据绑定为何向后台类变量返回Null?
解决WPF中PasswordConfirm对象始终为Null的问题
问题根源
ViewModel中仅声明了PasswordConfirm属性,但未对其进行实例化,导致双向绑定无法将密码框的值存入对象,最终使用时该对象始终为Null。
修复步骤
1. 初始化ViewModel中的PasswordConfirm对象
必须在ViewModel中创建PasswordConfirm的实例,绑定才能正常工作。有两种方式:
方式一:声明属性时直接初始化
public PasswordConfirm PasswordConfirm { get; set; } = new PasswordConfirm();
方式二:在ViewModel构造函数中初始化
// 假设你的ViewModel类名为RegisterVM public RegisterVM() { PasswordConfirm = new PasswordConfirm(); }
2. 可选:优化绑定的更新触发时机
为确保密码框输入时实时更新绑定值,可以给绑定添加UpdateSourceTrigger=PropertyChanged(如果你的BindablePasswordBox支持该触发方式):
<usercontrols:BindablePasswordBox x:Name="inputPassword" Password="{Binding Path=PasswordConfirm.InitialPassword, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> <usercontrols:BindablePasswordBox x:Name="inputPasswordConfirm" Password="{Binding Path=PasswordConfirm.SecondaryPassword, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
额外优化建议
可以把密码匹配逻辑封装到PasswordConfirm类内部,让代码更内聚:
internal class PasswordConfirm : ViewModelBaseClass { // ... 原有属性代码 ... // 添加密码匹配验证方法 public bool IsPasswordMatch() { return !string.IsNullOrWhiteSpace(InitialPassword) && InitialPassword.Equals(SecondaryPassword, StringComparison.Ordinal); } }
之后验证逻辑可以简化为:
if (PasswordConfirm != null) { if (PasswordConfirm.IsPasswordMatch()) { MainWindowVM mainVM = (MainWindowVM)Application.Current.MainWindow.DataContext; mainVM.CurrentDisplayPage = destinationPage; } else { ErrorMsg = "Passwords do not match"; } } else { ErrorMsg = "Please fill all fields"; }
内容的提问来源于stack exchange,提问作者Mitch W
相关产品推荐
相关产品推荐

