如何将视图中的命令绑定到 MvvmCross 中的视图模型

本文关键字:视图 MvvmCross 模型 绑定 命令 | 更新日期: 2023-09-27 18:32:58

我有这个安卓视图,我正在使用LegacyBar:

public class BaseView : MvxActivity
{
    public override void SetContentView(int layoutResId)
    {
        base.SetContentView(layoutResId);
        var bar = FindViewById<LB.LegacyBar>(Resource.Id.actionbar);
        bar.SetHomeLogo(Resource.Drawable.Icon);
        var attr = this.GetType()
            .GetCustomAttributes(typeof(ActivityAttribute), true)
            .FirstOrDefault() as ActivityAttribute;
        if (attr != null)
            bar.Title = attr.Label;
        bar.SetHomeAction(new ActionLegacyBarAction(ApplicationContext, doHomeAction, Resource.Drawable.Icon));
    }
    public ICommand homeActionClicked { get; set; }
    private void doHomeAction()
    {
        if (homeActionClicked != null && homeActionClicked.CanExecute(null))
            homeActionClicked.Execute(null);
    }
}

homeActionClicked在此视图中定义的命令绑定到其视图模型中的命令的正确方法是什么?或者,也许我应该创建一个自定义控件并将栏放入其中,然后绑定控件的命令?

如何将视图中的命令绑定到 MvvmCross 中的视图模型

您可以将 ViewModel 作为视图中的属性引用,以便可以访问它的属性并将命令从视图设置为视图模型。

protected MvvMCore.Core.ViewModels.NavigationBarViewModel NavigationBarViewModel {
            get{ return base.ViewModel as MvvMCore.Core.ViewModels.NavigationBarViewModel; }
        }

对于此属性,您可以按照@Chris建议进行操作 - 使用 base.ViewModel 和强制转换来访问 ViewModel,或者如果您想在 OnCreate 内部进行绑定,则可以使用 FluentBinding - 例如

var set = this.CreateBindingSet<BaseView, BaseViewModel>();
set.Bind(this).For(v => v.homeActionClicked).To(vm => vm.GoHomeCommand);
set.Apply();