使用Xamarin.Forms MessagingCenter在ViewModel和方法之间进行通信是否有任何优点或缺点

时间:2019-06-22 07:18:15

标签: xamarin xamarin.forms

我正在研究使用一种或另一种方法,尤其是方法2。谁能告诉我使用第二种方法优于第一种方法的优缺点。

方法1-ViewModel.cs

PTBtnCmd = new Command<Templates.WideButton>((btn) =>             
              MessagingCenter.Send<CFSPageViewModel, Templates.WideButton>(
              this, "PTBtn", btn));

方法1-MyPage.xaml.cs(此文件中的SetLang等。方法)

MessagingCenter.Subscribe<CFSPageViewModel, Templates.WideButton>(
        this, "PTBtn", (s, btn) =>
        {
            Utils.SetState(btn.Text, vm.PT);
            SetLangVisible(btn.Text);
            SetLangSelected(btn.Text);
            vm.CFSMessage = Settings.cfs.TextLongDescription();
        });

方法2-ViewModel.cs(此文件中的SetLang等方法)

PTBtnCmd = new Command<string>(SetMode);

private void SetMode(string btnText)
    {
        Utils.SetState(btnText, PT);
        SetLangVisible(btnText);
        SetLangSelected(btnText);
        CFSMessage = Settings.cfs.TextLongDescription();
    }

还希望听到有关将方法添加到ViewModel.cs代码中的想法的评论。将它们放在另一个文件中会更好吗?

2 个答案:

答案 0 :(得分:5)

邮件中心 帮助您保持代码解耦。有时候你会发现自己处于一个位置 要求您在某些代码之间创建引用,但是这样做,您必须 在可重用性和可维护性上做出妥协。

尝试将其用作最后的手段;通常有 实现所需功能的另一种方法。虽然发送消息可能非常 功能强大,过多使用它确实会影响您的可读性。

MessagingCenter的一个用例示例是您需要更新多个值的情况 您的应用程序的各个部分。您可以从多个地方订阅消息,然后执行 收到消息后,在多个位置编码。另一个用例可能是 后台进程完成后,它可以发送消息,然后您可以在 您的用户界面。

答案 1 :(得分:3)

我不会在VM层中使用消息传递,因为您的VM层只能在Xamarin.Forms中使用。一些Mvm框架(例如mvvmlight)提供消息传递功能。我会选择这样做,因为您可以在Wpf,Uwp或XF以外的其他UI框架中重用VM。

我也不会像您一样使用消息传递。如果可能仅使用数据绑定并在视图可以响应的VM中引发PropertyChanged事件。