我正在进行一个项目,在这个项目中,我试图实现MVVM,以正确地将业务逻辑与视图分离开来。尽管我阅读了很多关于这个模式的论文,并且看了示例应用程序,但我仍然有一些未回答的问题。
我的模型由一组Documents组成,其中包含不同类型的DocumentObjects列表。
DocumentObjects包含计算逻辑,彼此之间以及与Document之间具有交互作用。
然后我就有了我的观点和ViewModels ( Document和每种DocumentObjects各一种)
为了在正确的MVVM模式中实现这一点,我将使我的DocumentView显示DocumentObjects列表(例如,使用ItemsControl )。然后,WPF将选择通过DataTemplate条目使用的正确视图。
这种方法的问题在于,我希望在我的Document中保留一个实际DocumentObjects的列表,而不是它们的视图模型。然后,如果我使用DataTemplate来描述对象使用的视图,我就无法指定我希望使用的视图模型.
我的问题是:我如何在现有模型对象之上构建"VVM“部分,而不让它们知道呢?或者更实际地说,您将如何更改此设计模式以符合MVVM准则?
(我想要的是一种“模型优先”实例化。)
是一个示例应用程序,它提出了我的问题: In 里德·科普西关于MVVM的博客文章:
<DataTemplate DataType="{x:Type model:FeedItem}">
<TextBlock Text="{Binding Path=Title}" />
</DataTemplate>FeedItem模型由视图使用DataTemplate直接使用。如果FeedItem必须有一个ViewModel,怎么做呢?
(我知道我的设计可能不是最好的,我愿意听取建议!)
发布于 2013-05-29 09:41:13
我没有完全理解你的问题,但听起来你想要用一些附加的属性来增加一个模型,这就是视图模型的作用所在。
例如,您可能有一个Document模型,它有一个Item集合
public class Document
{
public List<Item> Items { get; set; }
}您希望使用一些不在Item类型上的附加属性来呈现视图中的每个项。您不希望使用这些与视图相关的附加属性来污染您的Item模型,因此您可以创建一个ItemViewModel。然后您通常会创建一个DocumentViewModel来保存这个集合:
public class DocumentViewModel
{
public List<ItemViewModel> ItemViewModels { get; set; }
}然后,视图将绑定到DocumentViewModel的一个实例。显然,需要一些管道代码来将数据传输到Document和DocumentViewModel类型。您可以使用像AutoMapper这样的库来帮助这一点。
当然,您可以决定您的Document类型已经包含了所有必需的属性,并且希望将它直接公开到您的视图中。这是and和LoD原则之间的平衡,所以您必须考虑这一点。
不过,最重要的是如果正在执行MVVM,则需要使用MVVM框架。这对视图组合也有很大帮助。例如,使用Caliburn.Micro,约定假定绑定到的任何集合都是视图模型的集合,它将自动定位相应的视图并将两者绑定在一起。
https://stackoverflow.com/questions/16809789
复制相似问题