使用MVVM从表单返回一个对象

本文关键字:返回 一个对象 表单 MVVM 使用 | 更新日期: 2023-09-27 18:17:32

我正在寻找关于以下场景设计的一些建议:

高层信息:

  • 我有一个WPF GUI,其中包含一个网格列出一些汽车信息。
  • 它包含一个按钮,"Add new Car…",弹出一个带有一些基本字段的表单,以便用户可以在列表中添加一个新的ICar对象。
  • 主窗口和表单都是按照MVVM模式设计的(以及命令的一些解耦)。

流程和问题:

  • 按钮"添加新车…"绑定到一个主窗口命令加载表单。
  • 表单绑定到一个背景对象,所以当用户按下"Ok"时,我希望对象返回到原始窗口。

然而,我不知道如何设计最后一步,也就是说,我应该:

  1. 在我的表单中有一些公共方法被调用,以便它本身:

    • 加载表单(ShowDialog..)
    • 属性绑定(已经完成)
    • 将新的Car对象返回给调用者(这里是主窗口)?
  2. :

    • 从主窗口调用form.ShowDialog()
    • 做其他的事情(我找不到如何)得到由用户定义的新的汽车对象?

    谢谢!

    使用MVVM从表单返回一个对象

    像这样:

    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属性。

    您可以在单击按钮时创建汽车的新实例,并将该实例传递给允许用户输入新车值的对话框。

    当对话框关闭时,主视图可以对汽车集合进行任何额外的验证(唯一车牌),当发现正确时,将新车添加到汽车集合中,并可能将此添加/更改传播到模型中。

    这样,对话框负责汽车的详细信息,主视图负责将汽车添加到集合中。

    相关文章: