使用MVVM从表单返回对象

时间:2013-06-10 04:52:21

标签: c# mvvm callback

我正在寻找有关以下方案设计的一些建议:

高级别信息:

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

流量和问题:

  • “添加新车...”按钮绑定到加载表单的主窗口命令。
  • 表单绑定到背景对象,因此当用户按下“确定”时,我希望将对象返回到原始窗口。

但是我不知道如何设计最后一步,即我应该:

  1. 我的表单中有一些公共方法可以被调用,因此它本身就是:

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

    • 从主窗口调用form.ShowDialog()。
    • 做一些其他事情(我找不到怎样)来取回用户定义的新Car对象?
  3. 谢谢!

2 个答案:

答案 0 :(得分:4)

这样的事情:

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进行依赖注入)。

答案 1 :(得分:0)

由于MainView有一个New Car按钮,Main ViewModel可能有一个属性NewCar。

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

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

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