如何使用MVVMCross和Xamarin.Android从ViewModel更新视图

Dil*_*mah 5 c# data-binding xamarin.android mvvmcross xamarin

对于使用xamarin.android的MVVMCross来说,这是一个很新的场景.我在片段中有一个fab和mvx.recyclerview.因此,当我点击这个工厂时,它将使Recyclerview连续滚动.

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

这是打破mvvm模式,所以MVVM Cross中有任何方法或方法,我可以用来从ViewModel收听View.

fab.click绑定与ICommand => viewmodel => view => updatescroll().

提前致谢.

Mat*_*att 10

好吧,因为不ViewModel应该知道View,你不应该调用它的任何方法.

我想提出一个eventViewModel那里你View可以订阅.因此,当您发生此类事件时,您可以调用event类似的内容,FabClickDone并且您的视图可以执行任何操作.在你的情况下滚动.

以下是ViewModel的代码示例:

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

protected virtual void OnFabClickDone()
{
    FabClickDone?.Invoke(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)

然后你只需要调用它

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

在您的View构造函数中订阅此事件:

ViewModel.FabClickDone += ViewModel_FabClickDone;
Run Code Online (Sandbox Code Playgroud)

并创建一个您想要滚动的方法

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

既然你正在使用MVVMcross,我会建议你使用一个命令来调用OnFabClickDone();