我有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
服务。