1

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

高层信息:

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

流程和问题:

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

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

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

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

    • 从主窗口调用 form.ShowDialog()。
    • 做其他事情(我找不到如何做)来取回用户定义的新 Car 对象?

谢谢!

4

2 回答 2

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; }
}

WhereIPresentationService是一项服务,旨在创建并显示一个弹出窗口。IPresentationService可以通过服务位置或依赖注入([Import]意味着使用 MEF 进行依赖注入)来获取实例。

于 2013-06-10T05:35:42.327 回答
0

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

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

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

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

于 2013-06-10T07:01:16.343 回答