.NET Maui使用Community Toolkit在两个视图模型间传递对象后字段不显示的问题
.NET Maui使用Community Toolkit在两个视图模型间传递对象后字段不显示的问题
嘿,我仔细看了你的代码,问题其实出在QueryProperty的配置和跳转参数的键不匹配上,导致你传递的TermModel对象根本没正确绑定到EditTermViewModel的属性里,所以页面上的输入框和日期选择器自然显示不出内容。
咱们一步步捋:
- 先看你跳转到EditTermPage时的代码:
await Shell.Current.GoToAsync(nameof(EditTermPage), true, new Dictionary<string, object> { { nameof(TermModel), term } });
这里你用的参数键是nameof(TermModel),也就是字符串"TermModel",这个是传递时的标识。
- 再看EditTermViewModel上的QueryProperty:
[QueryProperty(nameof(TermModel), "Term")]
这里犯了两个小错:
- 第一个参数应该是视图模型里用来接收对象的属性名,你写的是
nameof(TermModel)(这是类型名,不是属性名),而你的ViewModel里由[ObservableProperty]生成的公共属性是Term; - 第二个参数是跳转时要匹配的键名,你写的是"Term",和跳转时用的"TermModel"完全对不上,系统找不到对应的参数,自然没法赋值。
修复方案很简单,修改EditTermViewModel的QueryProperty:
// 第一个参数是ViewModel里的属性名Term,第二个是跳转时用的键名TermModel [QueryProperty(nameof(Term), nameof(TermModel))] public partial class EditTermViewModel : BaseViewModel { [ObservableProperty] private TermModel term; public EditTermViewModel() { } }
另外再提醒你两个关键点:
- 确保你的
BaseViewModel继承了ObservableObject(Community Toolkit的ObservableProperty依赖这个基类实现属性变更通知,不然UI不会响应属性变化); - 检查你的
TermModel类的属性都是public修饰的,不然UI控件没法绑定到私有属性上(看你代码里的绑定路径是Term.Title这类,应该没问题,但还是确认下更稳妥)。
你可以在EditTermViewModel的Term属性setter里加个断点,跳转后看看有没有值被传进来,这样就能快速验证修复是否生效啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

