菜单的MVVM最佳做法

时间:2019-06-22 11:55:00

标签: c# mvvm xamarin.forms

长时间的监听者,首次调用者。我对此很陌生,我认为这是一个非常简单的问题。

我正在构建Xamarin.Forms应用程序,并且具有许多静态菜单。问题是,最佳实践是在菜单的“ CodeBehind”中使用“ OnClick”事件还是创建ViewModel并将其绑定回导航命令?

对于其他所有内容,我一直将代码保留为空(除非有绑定上下文),这使我很烦恼,因为菜单在那里。两种方法都有好处吗?

OnClicked: .xaml

<Button Text="Fridge and Freezer" WidthRequest="300" BackgroundColor="DeepSkyBlue" Clicked="onClickedEvent_FridgeFreezer"/>

.cs(在代码背后)

async void onClickedEvent_FridgeFreezer(object sender, EventArgs args)
        {
            await Navigation.PushAsync(new FridgeFreezer());
        }

OR

绑定: .xaml

<Button Text="Fridge and Freezer" WidthRequest="300" BackgroundColor="DeepSkyBlue" Command="{Binding GoToFridgeFreezer}"/>

.cs(在ViewModel中)

public ICommand GoToFridgeFreezer{ get; private set; }

async void GoToFridgeFreezer()
{
wait Navigation.PushAsync(new FridgeFreezer());
}

3 个答案:

答案 0 :(得分:3)

MVVM的全部重点是使其得以实现,因此您无需实际启动即可测试尽可能多的应用程序。

使用自动UI测试,现在可以验证如果由View触发,导航是否正确进行,但这需要启动应用程序并实际运行其整个控制流程。因此,尽管有可能,但仍然很尴尬和缓慢。可能还有其他更好的框架,但是我发现Xamarin.Forms页面在单元测试中不能很好地发挥作用。根据我的经验,使用基于视图的导航意味着该应用程序的可测试性会自动降低。

但是,如果您将导航代码编码为在ViewModels中进行,则可以在不启动应用程序的情况下对其进行测试。您在测试中创建ViewModel的实例,将其发送给模拟的可能会导致导航的输入,并观察其尝试导航到的位置。这比测试基于视图的导航要简单得多,而且速度非常快。 我研究过的大多数MVVM应用程序(WPF,Xamarin)在ViewModel中都有导航逻辑,这意味着我要注入一个接口来照顾触发导航的问题。

答案 1 :(得分:1)

嗯,最佳实践建议在ViewModel中进行所有操作,并尽可能简化代码隐藏。

答案 2 :(得分:0)

感谢大家的评论和支持。

当我深入研究它时,我发现我需要在某些菜单选项中内置Dynamism和Logic,因此毫无疑问地转移到ViewModel来处理它。

如果其他人正在阅读本文,那么我建议您沿ViewModel路线走,如果有的话可以让您灵活地进行更改而无需进行大量工作。

特别感谢user11639555,我才刚刚开始尝试测试,那是非常宝贵的:)!!!

祝大家好运:)