MVVM放置通用逻辑的位置

时间:2018-06-27 17:59:38

标签: c# design-patterns mvvm prism

我有3个屏幕:带项目列表的主屏幕,一个项目详细信息屏幕和一个项目更新屏幕。

主屏幕显示项目列表,列表中的每个项目都有两个按钮:“更新”和“详细信息”。

如果用户点击“详细信息”按钮,则显示项目详细信息屏幕。此屏幕上还有一个“更新”按钮。

两个“更新”按钮都运行相同(常见)的逻辑:

  • 显示商品更新屏幕,
  • 或者,根据商品状态和其他逻辑,它向用户显示一条消息,告知他无法更新商品
  • 或根据其他逻辑,显示另一个屏幕

所以流程是:

Main (item list) screen -> Item details -> Item update
Main (item list) screen -> Item update

视图模型:

 class MainViewModel
 {
      readonly INavigationService _navigationService;
      readonly IDialogService _dialogService;

      public ICommand UpdateItemCommand { get; private set; }

      void ExecuteUpdateItem(Item item)
      {
           if(item.State == SomeState && otherLogic) 
           {
               _navigationService.NavigateTo("UpdateScreen");
           } else if(someLogic) {
               _navigationService.NavigateTo("OtherScreen");
           } else {
                // Show message to user
               _dialogService.ShowMessage(..);
           }
      }
 }

 class ItemDetailsViewModel
 {
      readonly INavigationService _navigationService;
      readonly IDialogService _dialogService;

      public ICommand UpdateItemCommand { get; private set; }

      void ExecuteUpdateItem(Item item)
      {
          // I don't want to duplicate code here
      }
 }

我不知道将ExecuteUpdateItem的正文放在何处,以免重复。

我的一个想法是生个孩子ItemViewModel

 class ItemViewModel
 {
      readonly INavigationService _navigationService;
      readonly IDialogService _dialogService;

       public ICommand UpdateItemCommand { get; private set; }

      void ExecuteUpdateItem(Item item)
      {
           // put code here
      }
 }

 class MainViewModel
 {
      public IEnumerable<ItemViewModel> Items { get; private set; }
 }

 class ItemDetailsViewModel
 {
      public ItemViewModel Item { get; private set; }
 }

还有更好的选择吗? 我可以让模型代替更新项目吗?我的模型可以启动视图之间的导航还是显示消息框?

class Item
{
    public void UpdateItem(INavigationService navigationService, IDialogService dialogService) 
    {
          // Put code here...

    }
}

或者也许有一个ItemService可以做到这一点?

视图模型通过依赖项注入获得INavigationService和IDialogService。 如果添加一个ItemService,则必须将这两个服务从视图模型传递到ItemService服务。

0 个答案:

没有答案