ViewModel中的ObservableCollection<Groups>无法在视图代码后台访问
问题原因及解决办法
为什么找不到Grps属性?
你直接在页面代码后台写Grps时,编译器默认会在PasswdInfo页面类自身的成员里找这个属性,但Grps是定义在PgViewModel类中的。虽然你把页面的BindingContext设成了PgViewModel的实例,但页面本身不会自动将ViewModel的属性映射为自己的成员,所以编译器会提示找不到。
解决方法
方法1:转换BindingContext后访问
在需要调用Grps的地方,先把BindingContext转换成PgViewModel类型,再访问属性:
// 安全转换,避免空引用 var viewModel = BindingContext as PgViewModel; if (viewModel != null) { // 这里可以正常访问Grps var myGroups = viewModel.Grps; }
如果想更严格,也可以用强制转换(但要确保BindingContext确实是PgViewModel实例):
var viewModel = (PgViewModel)BindingContext; var myGroups = viewModel.Grps;
方法2:提前声明ViewModel字段
在PasswdInfo的代码后台里先定义ViewModel字段,设置BindingContext时直接赋值,后续直接用字段访问:
// 页面类顶部声明字段 private PgViewModel _pgViewModel; // 比如在构造函数里初始化 public PasswdInfo() { InitializeComponent(); _pgViewModel = new PgViewModel(); BindingContext = _pgViewModel; } // 后续需要用Grps时直接调用 var myGroups = _pgViewModel.Grps;
额外注意
确保你在PasswdInfo的代码后台顶部已经引用了ViewModel所在的命名空间,不然连PgViewModel都识别不了:
using 你的项目名称.ViewModel;
内容的提问来源于stack exchange,提问作者Bob Gatto
相关产品推荐
相关产品推荐

