我正在研究使用一种或另一种方法,尤其是方法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代码中的想法的评论。将它们放在另一个文件中会更好吗?
答案 0 :(得分:5)
邮件中心 帮助您保持代码解耦。有时候你会发现自己处于一个位置 要求您在某些代码之间创建引用,但是这样做,您必须 在可重用性和可维护性上做出妥协。
尝试将其用作最后的手段;通常有 实现所需功能的另一种方法。虽然发送消息可能非常 功能强大,过多使用它确实会影响您的可读性。
MessagingCenter
的一个用例示例是您需要更新多个值的情况
您的应用程序的各个部分。您可以从多个地方订阅消息,然后执行
收到消息后,在多个位置编码。另一个用例可能是
后台进程完成后,它可以发送消息,然后您可以在
您的用户界面。
答案 1 :(得分:3)
我不会在VM层中使用消息传递,因为您的VM层只能在Xamarin.Forms中使用。一些Mvm框架(例如mvvmlight)提供消息传递功能。我会选择这样做,因为您可以在Wpf,Uwp或XF以外的其他UI框架中重用VM。
我也不会像您一样使用消息传递。如果可能仅使用数据绑定并在视图可以响应的VM中引发PropertyChanged事件。