使用MVVM从表单返回一个对象
本文关键字:返回 一个对象 表单 MVVM 使用 | 更新日期: 2023-09-27 18:17:32
我正在寻找关于以下场景设计的一些建议:
高层信息:
- 我有一个WPF GUI,其中包含一个网格列出一些汽车信息。
- 它包含一个按钮,"Add new Car…",弹出一个带有一些基本字段的表单,以便用户可以在列表中添加一个新的ICar对象。
- 主窗口和表单都是按照MVVM模式设计的(以及命令的一些解耦)。
流程和问题:
- 按钮"添加新车…"绑定到一个主窗口命令加载表单。
- 表单绑定到一个背景对象,所以当用户按下"Ok"时,我希望对象返回到原始窗口。
然而,我不知道如何设计最后一步,也就是说,我应该:
-
在我的表单中有一些公共方法被调用,以便它本身:
- 加载表单(ShowDialog..)
- 属性绑定(已经完成)
- 将新的Car对象返回给调用者(这里是主窗口)?
- 或
:
从主窗口调用form.ShowDialog() - 做其他的事情(我找不到如何)得到由用户定义的新的汽车对象?
谢谢!
像这样:
interface IPresentationService
{
bool ShowInDialog(ViewModel viewModel);
}
class CarViewModel : ViewModel {}
class MainViewModel : ViewModel
{
[Import]
private IPresentationService presentationService;
private void AddNewCar()
{
var car = new CarViewModel();
if (presentationService.ShowInDialog(car))
{
Cars.Add(car);
}
}
public MainViewModel()
{
Cars = new ObservableCollection<CarViewModel>();
AddNewCarCommand = new RelayCommand(AddNewCar);
}
public ObservableCollection<CarViewModel> Cars { get; private set; }
public ICommand AddNewCarCommand { get; private set; }
}
其中IPresentationService
是一个服务,用于创建并显示一个弹出窗口。IPresentationService
的实例可以通过服务位置或依赖注入获得([Import]
表示使用MEF进行依赖注入)。
就像MainView有一个NewCar按钮一样,主视图模型也可能有一个NewCar属性。
您可以在单击按钮时创建汽车的新实例,并将该实例传递给允许用户输入新车值的对话框。
当对话框关闭时,主视图可以对汽车集合进行任何额外的验证(唯一车牌),当发现正确时,将新车添加到汽车集合中,并可能将此添加/更改传播到模型中。
这样,对话框负责汽车的详细信息,主视图负责将汽车添加到集合中。