首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVMCross Messenger插件

MVVMCross Messenger插件
EN

Stack Overflow用户
提问于 2013-11-05 21:10:58
回答 1查看 1.4K关注 0票数 1

对于N=9,我想做的是代替ILocationService,我有自己的INavigationService和一个导航服务类。

代码语言:javascript
复制
  public class NavigationService :INavigationService
{
    private readonly IMvxMessenger _navigator;

    public NavigationService(IMvxMessenger navigator)
    {
        _navigator = navigator;
    }

    public void OnNavigation(PurchasesDataEntryViewModel vm)
    {
        var navigationMessage = new NavigationMessage(this,vm);
        _navigator.Publish(navigationMessage);
    }

}

这是我的信使班:

代码语言:javascript
复制
   public class NavigationMessage : MvxMessage
{
    public string ShopID { private set; get; }
    public int TotalStock { private set; get; }
    public int TotalPurchases { private set; get; }
    public int Stock1 { private set; get; }
    public int Stock2 { private set; get; }
    public int Stock3 { private set; get; }
    public int Purch1 { private set; get; }
    public int Purch2 { private set; get; }
    public int Purch3 { private set; get; }
    public string Name { private set; get; }
    public string CPrice { private set; get; }
    public int CSales { private set; get; }
    public string BrandID { private set; get; }
    public string CatID { private set; get; }
    public int LadgePur { private set; get; }
    public decimal LPrice { private set; get; }
    public int LPurch { private set; get; }
    public int LSales { private set; get; }
    public int LStock { private set; get; }
    public int LStock1 { private set; get; }
    public string MeasureID { private set; get; }


    public NavigationMessage(object sender, PurchasesDataEntryViewModel vm)
        : base(sender)
    {
        ShopID = vm.ShopID;
        TotalStock = vm.TotalStock;
        TotalPurchases = vm.TotalPurchases;
        Stock1 = vm.Stock1;
        Stock2 = vm.Stock2;
        Stock3 = vm.Stock3;
        //Purch1 = vm.Purch1;
        //Purch2 = vm.Purch2;
        //Purch3 = vm.Purch3;
        Name = vm.Name;
        CPrice = vm.CPrice;
      //  CSales = vm.CSales;
        BrandID = vm.BrandID;
        CatID = vm.CatID;
        LadgePur = vm.LadgePur;
        LPrice = vm.LPrice;
        LPurch = vm.LPurch;
        LSales = vm.LSales;
        LStock = vm.LStock;
        LStock1 = vm.LStock1;
        MeasureID = vm.MeasureID;
    }

我想要实现的是将上面的值发送到我的订阅服务器PurchasesDataEntryViewModel。

代码语言:javascript
复制
 private readonly IDataService _dataService;
    private readonly MvxSubscriptionToken _token;

    public PurchasesDataEntryViewModel(IDataService dataService,INavigationService service, IMvxMessenger navigator)
    {
        _dataService = dataService;
        _token = navigator.Subscribe<NavigationMessage>(OnNavigationMessage);
    }

    private void OnNavigationMessage(NavigationMessage navigationMessage)
    {
        ShopID = navigationMessage.ShopID;
        .
        .
        .

    }

}

我去不了了。我需要了解发布/订阅的交互和生命周期。这两个视图模型将如何理解如何沟通。我需要以某种方式告诉我的Messenger服务,我想通过信使类从ViewModel A向ViewModel B发送参数。这是我第一次使用插件,所以请原谅我的愚蠢问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 07:13:21

介绍了MessengerPublishSubscribe方法在https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#Messenger中的使用。

在我看来,您使用了问题中代码中的调用--导航服务发布的任何消息都应该由所有现有的PurchasesDataEntryViewModel接收。

在您的评论之后更新

当我发布消息时,我期望调试器触发PurchasesDataEntryViewModel类的构造函数

这是错误的。

任何信使(无论是否MvvmCross)都只能在现有对象之间传递消息--它不能动态创建新的侦听器。

如果您确实希望创建一个响应于消息的新对象,那么您将需要从一个Factory对象订阅该消息类型,然后该Factory对象将需要在其消息处理程序中创建新的对象。

代码语言:javascript
复制
private readonly MvxSubscriptionToken _token;

public Factory(IMvxMessenger navigator)
{
    _token = navigator.Subscribe<NavigationMessage>(OnNavigationMessage);
}

private void OnNavigationMessage(NavigationMessage navigationMessage)
{
    switch (navigationMessage.NavType)
    {
         case NavType.One:
             var newOne = new One(navigationMessage.Args);
             // use newOne;
             // ...

         // ...
    }
}

对于UI导航,您需要确保您编写的任何Factory对象都将创建ViewViewModel

实际上,如果您想编写自己的导航服务,那么您将需要编写一个特定于您所支持的每个平台的导航服务--因为每个平台都有不同的导航技术和生命周期(Android有Intent,WP有Uri,iOS有基于代码的转换等等)。

由于MvvmCross已经提供了跨平台导航服务,因此您可能会发现使用该服务并使用自定义演示器进行调整变得更容易--这将在以下部分进行讨论:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19799048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档