2010-03-02 50 views
14

我正在研究使用MVVM,虽然我大部分理解它,但有一件事我无法得到我的头。MVVM将数据传递给对话框查看模型

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

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

1)我是否必须将消息发送回视图,这将打开对话窗口?如果是这样,这是否违背了命令的目的?

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

我觉得这是阻止我使用MVVM的难题的最后一部分,我真的很想为此获得一个很好的解耦解决方案。

感谢 马特

回答

2

我也许会做下列方式:

  1. 连接到编辑按钮的命令开始编辑对话框,创建一个自定义视图模型(VM)。命令本身应该可能在列表的虚拟机或模型中(不太确定)。
  2. Foobar编辑对话框的虚拟机在其构造函数中获取对Foobar的引用。
  3. foobar被克隆,克隆被编辑。
  4. 只要用户在foobar编辑对话框中按下确定,克隆的值就会被写回VM中原始的foobar(并关闭对话框)。

对克隆的需求来自用户不希望在foobar列表中看到更改,直到他接受编辑对话框中的更改。如果在线编辑没问题,则不需要克隆。

更改会自动传播。 PS:虽然我是MVVM的支持者,但我不确定我的解决方案是否是纯粹的MVVM观点的正统观点。

1

This article from codeproject显示了一个WPF对话框控件,它完全符合你的需求。这个实现的必要性的原因是你不能在任何其他控件的可视化树中放置一个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; 
    } 
} 

要连接Vie w至编辑FooBar的到FooBar的视图模型只是做这样的事情(最好是在Application.Resources所以它的全球)

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

(或可选:使用的IValueConverter来转换从视图模型like this post shows让你查看)

然后你就定了。听起来很多,但它真的让你感觉很舒服。

+0

这是一个有趣的方法。看看这个示例项目,我想知道是否会因为失去一个普通窗口的某些功能(调整大小,无模式等)而受到刺激。 我开始认为这可能值得我考虑一个根本不需要复杂对话框的设计 - 而且可能有一个MDI应用程序。 你对此有何看法? – Matt 2010-03-03 21:00:37

0

缺少的是负责视图模型工作流程的控制器。控制器创建ViewModels,并在ViewModels之间传递必要的数据。

WPF Application Framework (WAF)项目包含示例应用程序,显示这可能如何工作。

相关问题