WPF MVVM下TabControl多页面TextBox数据读写失效问题排查
问题根因定位
核心逻辑错误
数据加载和UI绑定上下文完全脱节,所有属性修改操作都没有触达实际的绑定源对象:
- Page在XAML中通过
<Page.DataContext>初始化了独立的DataGebruikerViewModel实例,该实例内部持有唯一的、供UI绑定使用的DataGebruiker对象 DataInlezen方法中自行new了一个全新的DataGebruiker实例,所有赋值操作都是针对这个孤立的新对象,和UI绑定的对象没有任何引用关联,自然无法触发界面回填- 用户在TextBox中输入的内容,会按照双向绑定规则回写到UI绑定的那个
DataGebruiker实例上;如果保存逻辑也像DataInlezen一样自行新建对象,自然无法读取到输入内容
修复方案
1. 打通数据加载通道,不要创建孤立对象
修改DataInlezen方法,从TabControl承载的Page中获取真实的DataContext实例,直接对绑定源对象赋值:
public void DataInlezen(string Json) { // 替换为项目中承载用户信息的实际Page类名 var userInfoPage = tabControl.SelectedItem as DataGebruikerPage; if (userInfoPage?.DataContext is DataGebruikerViewModel viewModel) { var Djson = JsonConvert.DeserializeObject<JsonCS>(Json); foreach (var AlgeInf in Djson.algemeneInformatie) { // 直接对viewModel内部持有的、和UI绑定的对象赋值 viewModel.DataGebruiker.Achternaam = AlgeInf.Achternaam; viewModel.DataGebruiker.Voornaam = AlgeInf.Voornaam; // 其余数据项按相同规则赋值即可 } } }
2. 显式声明双向绑定规则
为了避免WPF绑定默认值带来的歧义,给TextBox的绑定明确指定双向回写模式:
<TextBox Text="{Binding DataGebruiker.Achternaam, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" FontSize="24" VerticalContentAlignment="Center" Margin="6" Grid.Column="1" Grid.Row="0" />
3. 保存逻辑同步调整
写保存逻辑时,同样不要自行新建ViewModel或Model实例,通过Page的DataContext拿到真实的绑定源对象,直接读取viewModel.DataGebruiker下的各属性值组装提交数据即可。
内容的提问来源于stack exchange,提问作者Nicolas Vanruysseveldt
相关产品推荐
相关产品推荐

