WPF使用MVVMCross框架嵌套用户控件后绑定属性失效问题
问题根源
你直接将子视图硬编码嵌入父视图时,MvvmCross没有自动为StudentDetailsView关联对应的StudentDetailsViewModel,子视图的DataContext继承了父窗口的ViewModel,找不到FirstName、LastName等属性,所以所有绑定失效。
临时修复当前绑定问题
如果只需要先让当前嵌套视图的绑定生效,手动为子视图指定DataContext即可:
- 给主窗口对应的
MainViewModel添加子ViewModel属性:
public StudentDetailsViewModel StudentVM { get; set; } = new StudentDetailsViewModel();
- 修改MainWindow.xaml里的子视图声明:
<local:StudentDetailsView DataContext="{Binding StudentVM}"/>
实现动态切换子视图的推荐方案
你要做的菜单切换视图的场景,直接用MvvmCross提供的ViewModel-first视图匹配机制实现即可,不用手动硬编码视图:
1. 实现MainViewModel
using MvvmCross.Commands; using MvvmCross.ViewModels; using MvxStarter.Core.ViewModels; namespace MvxStarter.Core.ViewModels { public class MainViewModel : MvxViewModel { // 绑定到内容控件的当前子ViewModel private MvxViewModel _currentView; public MvxViewModel CurrentView { get => _currentView; set => SetProperty(ref _currentView, value); } // 菜单切换命令 public IMvxCommand OpenStudentViewCommand => new MvxCommand(() => { CurrentView = new StudentDetailsViewModel(); }); // 其他视图切换命令同理扩展 public IMvxCommand OpenOtherViewCommand => new MvxCommand(() => { // CurrentView = new 你的其他子ViewModel(); }); public MainViewModel() { // 默认加载学生详情页 OpenStudentViewCommand.Execute(); } } }
2. 修改MainWindow.xaml
- 先确认命名空间包含
xmlns:mvx="clr-namespace:MvvmCross.Platforms.Wpf.Binding;assembly=MvvmCross.Platforms.Wpf" - 替换原来硬编码子视图的位置为MvvmCross提供的内容控件:
<Grid> <!--Dynamic view switch out here--> <mvx:MvxContentView Content="{Binding CurrentView}" /> </Grid>
- 给菜单项绑定切换命令:
<MenuItem Header="学生信息" Command="{Binding OpenStudentViewCommand}"/> <!--其他菜单项绑定对应的命令即可-->
MvvmCross会根据你设置的CurrentView的ViewModel类型,自动匹配对应的子视图,且自动绑定正确的DataContext,完全符合MVVM规范。
内容的提问来源于stack exchange,提问作者OrionsBelt
相关产品推荐
相关产品推荐

