Xamarin MVVMCross:如何从MainActivity向ViewModel传递数据?SearchView查询文本传递报错求助
解决MvvmCross中SearchView查询文本传递到ViewModel的问题
你遇到的错误非常典型——你正试图通过类名访问ViewModel的实例属性SearchText,但SearchText是一个非静态成员,必须通过ViewModel的实例来访问。
快速修复:使用MvxActivity提供的ViewModel实例
MvvmCross的MvxActivity<TViewModel>已经为你自动维护了ViewModel的实例,你可以直接通过ViewModel属性来访问它,而不是用类名MoviesViewModel。修改你的事件处理代码即可:
search.QueryTextSubmit += (sender, e) => { var searchText = e.NewText; // 用ViewModel属性代替类名访问实例成员 ViewModel.SearchText = searchText; };
确保ViewModel的属性正确定义
还要确认你的MoviesViewModel里的SearchText是public的可写属性,推荐使用MvvmCross的属性变更通知特性,方便后续UI响应数据变化:
public class MoviesViewModel : MvxViewModel { private string _searchText; public string SearchText { get => _searchText; set => SetProperty(ref _searchText, value); } }
这里的SetProperty是MvvmCross的核心方法,会自动触发属性变更通知,让绑定的UI元素能实时感知数据变化。
更优雅的MVVM绑定方式(可选)
如果你想完全遵循MVVM模式,避免手动处理View的事件,可以直接用MvvmCross的绑定系统,把SearchView的查询文本和ViewModel的属性自动同步:
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); // 别忘了设置页面布局 SearchView search = FindViewById<SearchView>(Resource.Id.searchview); search.QueryHint = "Search movie title.."; // 创建绑定集合 var bindingSet = this.CreateBindingSet<MainAcitvityView, MoviesViewModel>(); // 绑定SearchView的Query属性到ViewModel的SearchText bindingSet.Bind(search).For(v => v.Query).To(vm => vm.SearchText); // 可选:如果需要在提交查询时触发ViewModel的命令,还可以绑定QueryTextSubmit事件 // bindingSet.Bind(search).For(v => v.QueryTextSubmit).To(vm => vm.SearchCommand); bindingSet.Apply(); }
这种方式不需要手动处理事件,MvvmCross会自动帮你完成数据同步,更符合MVVM的视图与逻辑分离原则。
内容的提问来源于stack exchange,提问作者pegob




