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

8

我是一个新手,在使用xamarin.android的MVVMCross方面有些困惑。我的场景是在一个Fragment中有一个Floating Action Button(FAB)和一个MvxRecyclerView。当我点击这个FAB时,它将使RecyclerView向下滚动一行。

即:

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

这会破坏MVVM模式,那么在MVVM Cross中是否有任何方法或方式可以让ViewModel监听View的反馈呢。

fab.click绑定到ICommand => ViewModel => View=> 更新滚动条()。

提前感谢您的帮助。

1个回答

13

既然 ViewModel 不应该知道 View,那么你不应该调用它的任何方法。

我建议在你的 ViewModel 中使用一个 event,让你的 View 可以订阅。所以你可以称呼你的 eventFabClickDone,当这个事件发生时,你的视图会做它想做的事情,在你的情况下是滚动。

以下是你的 ViewModel 的代码示例:

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

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

然后你只需调用它:

void onclick(sender object , eventargs e)
{
    // Do something inside your viewmodel
    // ...
    OnFabClickDone();
}
在您的View构造函数中订阅此事件:

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

ViewModel.FabClickDone += ViewModel_FabClickDone;

创建一个方法,在该方法中进行滚动操作。

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

既然您正在使用MVVMcross,我建议您使用命令(command),在其中调用OnFabClickDone()方法。


可能我有点晚了,但是我的视图构造函数无法看到.FabClickDone事件字段。 - DanilGholtsman
@DanilGholtsman - 请尝试使用((MyViewModelClass)BindingContext).FabClickDone - ToolmakerSteve
实际上在mvvmcross中,protected override void OnViewModelSet() { base.OnViewModelSet(); var vm = ViewModel as MyViewModelClass; vm.FabClickDone += ... } - ToolmakerSteve
你可以使用 EventHandler 委托来替代 FabClickDoneEvent。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接