Как связать команду внутри View с ViewModel в MvvmCross

У меня есть этот вид Android, где я использую 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 определен внутри этого вида для команды в его ViewModel? Или, может быть, я должен сделать пользовательский элемент управления и поместить панель внутри него, а затем связать команду элемента управления?

2 ответа

Решение

Для этого свойства вы можете сделать то, что предлагает @Chris - используя base.ViewModel и приведение, чтобы дать вам доступ к ViewModel, или вы можете использовать FluentBinding, если вы хотите сделать привязку внутри OnCreate - например

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

Вы можете ссылаться на вашу ViewModel как на свойство в вашем представлении, чтобы вы могли получить доступ к его свойствам и установить команду из вашего представления в viewmodel.

protected MvvMCore.Core.ViewModels.NavigationBarViewModel NavigationBarViewModel {
            get{ return base.ViewModel as MvvMCore.Core.ViewModels.NavigationBarViewModel; }
        }
Другие вопросы по тегам