Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Update View from ViewModel using MVVMCross and Xamarin.Android

Am new to MVVMCross with xamarin.android so little struck up with a scenario. I have a fab and mvx.recyclerview inside a fragment. so when i click on this fab it will make the recyclerview scroll by a row.

i.e

void onclick(sender object ,eventargs e)
{
   mrecyclerview.SmoothScrollToPosition(somevariable++); // do something.
}

this is breaking mvvm pattern, so is there any way or method in the MVVM Cross which i can use to listen back to the View from ViewModel.

fab.click binding with ICommand => viewmodel => view=> updatescroll().

thanks in advance.

like image 647
Dilmah Avatar asked Apr 27 '16 17:04

Dilmah


1 Answers

Well, since the ViewModel should not know about the View, you should not call any method of it.

I would propose an event in your ViewModel where your View can subscribe. So you call your event something like FabClickDone and your view does what ever it wants, when this event occured. In your case scrolling.

Here is an code example for your ViewModel:

public delegate void FabClickDoneEvent(object sender, EventArgs args);
public event FabClickDoneEvent FabClickDone;

protected virtual void OnFabClickDone()
{
    FabClickDone?.Invoke(this, EventArgs.Empty);
}

You then just call it by

void onclick(sender object , eventargs e)
{
    // Do something inside your viewmodel
    // ...
    OnFabClickDone();
}

In your View constructor subscribe to this event:

ViewModel.FabClickDone += ViewModel_FabClickDone;

And create a method where you want to do your scrolling

void ViewModel_FabClickDone(Object sender, EventArgs e)
{
    mrecyclerview.SmoothScrollToPosition(somevariable++); // do something.
}

Since you're using MVVMcross I would suggest you using a command, where you call OnFabClickDone();

like image 70
Matt Avatar answered Nov 05 '22 00:11

Matt