使用Microsoft MVVM模板开发桌面购物应用时MemberName源属性未更新问题
问题根因及修复方案
1. XAML绑定路径错误
当前TextBox的绑定逻辑直接查找ViewModel层的MemberName属性,但实际上MemberName是ViewModel中LogMember对象的下属属性,绑定路径层级不匹配,导致无法关联到正确的源属性。
修复后的TextBox绑定代码:
<TextBox Text="{Binding Path=LogMember.MemberName, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" x:Name="TextBoxAddMembername" Height="27" TextWrapping="Wrap" />
2. 登录按钮点击事件错误实例化ViewModel
你在BttnLogin_Click方法中重新new了一个LogInViewModel对象,这个新实例和界面已经绑定的ViewModel没有关联,就算绑定路径修复后也拿不到界面输入的值,需要直接获取当前窗口绑定的已有ViewModel实例:
修复后的点击事件代码:
private void BttnLogin_Click(object sender, RoutedEventArgs e) { // 直接获取当前窗口绑定的ViewModel实例,不要重新创建 LogInViewModel logPassword = (LogInViewModel)this.DataContext; string dbPassword = logPassword.ObtainPassword(); if (dbPassword.Equals(Typepass.Password.ToString())) { MainWindow newMainWindow = new MainWindow(); newMainWindow.Show(); MessageBox.Show("登录成功"); this.Close(); } else { MessageBox.Show("登录失败,请重试"); } }
可选优化说明
当前PasswordBox未实现MVVM绑定,如果要严格遵循MVVM规范可以通过附加属性实现Password的双向绑定,现有后台直接取Typepass.Password的写法也可以正常运行。
另外可以将Window_Loaded方法中的ViewModel局部变量提升为窗口类的全局变量,方便后续业务逻辑调用,不影响现有功能运行。
内容的提问来源于stack exchange,提问作者veldo
相关产品推荐
相关产品推荐

