这个问题与设计帮助有关。在其中我提出了一个问题,以及我想到的一些解决方案,以及我对解决方案的看法;最后我认为是正确的解决方案。我正在寻求对我的解决方案进行验证或挑战。对不起,很长的帖子。
我有一个ConfigActivityGroup
类(模型)。它代表了一组活动。用户可以有许多ActivityGroups
,每个ConfigActivityGroupVM
包含组的名称和多个字符串活动。
我有一个ConfigActivityGroups
,可以在ConfigActivityGroupVM
ConfigActivityGroups
保留ObservableList< ConfigActivityGroup>对于ConfigActivityGroupVM
。 CollectionViewSource
还为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
(后者又拥有自己的ConfigActivityGroup
和ConfigActivityGroup
)。然后,我可以让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,我试图将职责分开,尽量使用命令。
额外数据: