MVVM将数据传递到对话框视图模型

时间:2010-03-02 22:33:29

标签: wpf mvvm parameters viewmodel

我正在研究使用MVVM,虽然我在很大程度上理解它,但有一件事我无法理解。

想象一下,我有一个View和ViewModel组合,显示了一个foobar列表。当用户在列表中选择foobar并单击编辑按钮时,我希望foobar显示在弹出对话框窗口中,以便进行编辑。此对话框窗口(视图)将具有自己的关联ViewModel。

我知道按钮可以绑定到ViewModel列表上的命令,但是从这里我如何实例化foobar编辑器?

1)我是否必须将信息发送回View,这将打开对话窗口?如果是这样,这不会破坏拥有命令的目的吗?

2)如何将foobar传递给编辑器的ViewModel?如果它是由它的构造函数,这不是很难在XAML中声明ViewModel吗?

我觉得这是阻止我使用MVVM的最后一块拼图,我真的希望得到一个很好的解耦方案。

由于 马特

3 个答案:

答案 0 :(得分:2)

我或许可以通过以下方式进行:

  1. 附加到编辑按钮的命令启动编辑对话框,为其创建自定义ViewModel(VM)。命令本身可能应该在列表的VM中或模型中(不太确定)。
  2. Foobar编辑对话框的VM在其构造函数中获取对Foobar的引用。
  3. 克隆foobar并编辑克隆。
  4. 用户在foobar编辑对话框中按OK后,克隆的值将被写回VM中的原始foobar(并且对话框已关闭)。
  5. 对克隆的需求来自于这样一个事实:用户不希望看到foobar列表中的更改,直到他接受编辑对话框中的更改。但是,如果在线编辑没问题,则不需要克隆。

    更改会自动传播。

    PS:虽然我是MVVM的支持者,但我不确定我的解决方案是从纯MVVM的角度来看是正统的。

答案 1 :(得分:1)

来自codeproject的

This article显示了一个完全符合您需要的WPF Dialog控件。这种实现是必要的原因是您不能将Window放在任何其他控件的可视树中。这意味着开箱即用的WPF不允许您在窗口内创建对话框。因此,上面的文章创建了一个创建窗口的子类ContentControl。

无论如何,你把它放在你的FooBarList视图

<dialog:Dialog Content="{Binding Path=DialogViewModel}" /> 

你确保在某个地方的资源字典中有这样的东西:

<Style TargetType="{x:Type dialog:Dialog}">
 <Style.Triggers>
  <Trigger Property="HasContent" Value="True">
   <Setter Property="Showing" Value="True" />
  </Trigger>
 </Style.Triggers>
</Style>

并且只写这样的东西(要使WPF工作,你需要实现INotifyPropertyChanged):

public Class FooBarListViewModel
{
  IList<FooBar> FooBarList {get;set;}
  FooBar SelectedFooBar {get;set;}
  ViewModelBase DialogViewModel {get;set;}

  public EditFooBar(object param)
  {
    DialogViewModel = FooBar;
  }
}

要链接View以编辑FooBar到FooBar ViewModel,只需执行以下操作(最好在Application.Resources中,这样它就是全局的)

<DataTemplate DataType={x:Type vm:FooBarViewModel}>
  <vw:FooBarView/>
</DataTemplate>

(或者可选:使用IValueConverter转换从ViewModel获取视图like this post shows

然后你就定了。可能听起来很多,但它确实让你感到高兴。

答案 2 :(得分:0)

缺少的是一个负责ViewModel工作流程的Controller。 Controller创建ViewModels,并在ViewModels之间传递必要的数据。

WPF Application Framework (WAF)项目包含展示如何运作的示例应用程序。