You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动