使用ViewModel,Model和CollectionView设计混淆

时间:2015-05-07 12:42:06

标签: wpf mvvm observablecollection collectionviewsource icollectionview

这个问题与设计帮助有关。在其中我提出了一个问题,以及我想到的一些解决方案,以及我对解决方案的看法;最后我认为是正确的解决方案。我正在寻求对我的解决方案进行验证或挑战。对不起,很长的帖子。

我有一个ConfigActivityGroup类(模型)。它代表了一组活动。用户可以有许多ActivityGroups,每个ConfigActivityGroupVM包含组的名称和多个字符串活动。

我有一个ConfigActivityGroups,可以在ConfigActivityGroupVM

上为CRUD提供命令

ConfigActivityGroups保留ObservableList< ConfigActivityGroup>对于ConfigActivityGroupVMCollectionViewSource还为ObservableList< ConfigActivityGroup>保留ICollectionView。并为要访问的UI提供ICollectionViewSource

我还没有完成用户界面,但我计划将Activities绑定到列表,用户可以从中单击某个项目;并查看包含GroupName的文本框,以及与第一个列表相邻的ActivityGroup ConfigActivityGroup的另一个列表。

这一切都很好,因为我有ICollectionView提供的当前ConfigActivityGroup概念。我可以使用当前Activities绑定到第二个UI列表,以在当前ConfigActivityGroup中显示CRUD

问题:当我想针对当前ConfigActivityGroup的活动为Activities构建命令时。

如果ConfigActivityGroup中的List<string>位于DeleteCurrentActivityCommand并且我将它们直接绑定到用户界面,那么我就没有“可以绑定”当前活动的概念 - 在UI中,以便我可以在VM中使用ConfigActivityGroup命令删除当前命令的当前活动。

第一个解决方案我曾经在VM中选择ConfigActivityGroup(通过ICollectionView),将选定的ObservableCollection<string>中的活动复制到新的ViewSource中VM中的ICollectionView(后者又拥有自己的ConfigActivityGroupConfigActivityGroup)。然后,我可以让UI第二个列表绑定到当前ICollectionView.CurrentItem的活动的ICollectionView。因此,我的命令会修改活动的ICollectionView。但是,当我尝试为当前ActivityString创建新活动时,我遇到了障碍,我无法将活动“List<string>设置为不同的活动字符串(因为它是只读的) 。

我认为一个解决方案是将ConfigActivityGroup类中的活动字符串装箱有一个字符串。总的来说,我对这种方法不太满意。

第二个解决方案我想,是让ObservableCollection<string>中的json-deserialisation成为ObservableCollection。这将简化VM。我对使用这种方法犹豫不决,因为模型是从非UI线程通过魔术List<string>(MyCouch + CouchDB)从数据库加载的,然后ConfigActivityGroup出现问题(我想,从内存中)从与其创建线程不同的线程访问。我认为使用众多线程安全的ObservableCollections之一是过度杀伤。

第三个解决方案我在写这个问题时想到的是为ConfigActivityGroup中的活动保留模型ICollectionView。然后,在CollectionViewSource/ICollection中选择List<string>后,将.header { position: absolute; left: 0; right: 0; font-size: 20px; text-align: center; text-decoration: underline; } .parent { border: solid 3px #000; padding: 5px; position: relative; } .button { float: right; }的{​​{1}}活动直接初始化为来源。这样,UI可以直接绑定到活动,UI可以负责编辑实际的活动字符串;并保留当前所选活动的概念,然后我可以使用命令将其删除。

认为第三种方法是正确的方法,但我很乐意听到社区的想法。这是我第一次使用MVVM,我试图将职责分开,尽量使用命令。

额外数据:

  • 从数据库加载ConfigActivityGroup并将其放入VM后,其他任何人都不会通过UI更改VM本身。

0 个答案:

没有答案