使用Xamarin.Forms MessagingCenter在ViewModel和方法之间进行通信有什么优点或缺点吗

pexxcrt2  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(148)

我正在研究使用一种或另一种方法,特别是方法2。谁能告诉我使用第二种方法比第一种方法的优点和缺点。
方法1 -查看模型. 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代码中的想法的评论。将这些方法放在另一个文件中是否更好?

gz5pxeao

gz5pxeao1#

MessagingCenter可以帮助您保持代码的分离。有时您会发现自己处于一个需要在某些代码之间创建引用的位置,但这样做就不得不在可重用性和可维护性方面做出妥协。
尽量把它作为最后的手段;通常还有另外一种方法来实现你想要的功能。2虽然发送消息的功能非常强大,但是过多地使用它确实会削弱你的可读性。
MessagingCenter的用例示例是您需要更新应用多个部分中的值的情况。您可以从多个位置订阅消息,从而在收到消息时在多个位置执行代码。另一个用例可能是,如果某个后台进程完成,它可以发送消息,然后您可以在UI中通知用户。

mkh04yzy

mkh04yzy2#

我不会在VM层中使用消息传递,因为VM层只能在Xamarin.Forms中使用。一些Mvm框架,如mvvmlight,提供了消息传递功能。我会选择它,因为这样您就可以在Wpf、Uwp或除XF之外的其他UI框架中重用您的VM。
我也不会像你那样使用消息传递。如果可能的话,就使用数据绑定并在VM中引发PropertyChanged事件,视图可以对此做出React。

368yc8dk

368yc8dk3#

要在虚拟机之间传递数据,我建议使用导航参数或重新考虑一般情况下如何使用这些数据(使用某种服务或根据客户端应用程序的“胖”程度降低UI)。
正如@Andy提到的消息中心会导致可重用性问题,但这并不意味着你不能使用它。我的方法是将它 Package 在一个单独的服务中,并在实现中使用它。这将让你做两件事:根据您的用例创建更方便或更好的方式来使用它,如果您需要在WPF项目中使用这些VM,还可以选择将Messenger的实现交换到任何其他pub-sub库(或您自己的实现)。
当然,使用跨平台通用的东西也是一个很好的选择,但这也取决于你在多大程度上被“允许”/可以使用第三方的东西。至少对于MAUI来说,这会导致一些问题,但这是另一个主题。

相关问题