我正在研究使用MVVM,虽然我在很大程度上理解它,但有一件事我无法理解。
想象一下,我有一个View和ViewModel组合,显示了一个foobar列表。当用户在列表中选择foobar并单击编辑按钮时,我希望foobar显示在弹出对话框窗口中,以便进行编辑。此对话框窗口(视图)将具有自己的关联ViewModel。
我知道按钮可以绑定到ViewModel列表上的命令,但是从这里我如何实例化foobar编辑器?
1)我是否必须将信息发送回View,这将打开对话窗口?如果是这样,这不会破坏拥有命令的目的吗?
2)如何将foobar传递给编辑器的ViewModel?如果它是由它的构造函数,这不是很难在XAML中声明ViewModel吗?
我觉得这是阻止我使用MVVM的最后一块拼图,我真的希望得到一个很好的解耦方案。
由于 马特
答案 0 :(得分:2)
我或许可以通过以下方式进行:
对克隆的需求来自于这样一个事实:用户不希望看到foobar列表中的更改,直到他接受编辑对话框中的更改。但是,如果在线编辑没问题,则不需要克隆。
更改会自动传播。
PS:虽然我是MVVM的支持者,但我不确定我的解决方案是从纯MVVM的角度来看是正统的。答案 1 :(得分:1)
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)项目包含展示如何运作的示例应用程序。