这个问题与设计帮助有关。在其中我提出了一个问题,我想到的一些解决方案,以及我对解决方案的看法;最后一个我认为是正确的解决方案。我正在寻求对我的解决方案的验证或挑战。对不起,很长的帖子。
我有一个ConfigActivityGroup
班级(模型)。它代表一组活动。一个用户可以有很多ActivityGroups
,每个都包含组的名称和多个活动,这些活动是字符串。
我有一个ConfigActivityGroupVM
提供 CRUD 的命令ConfigActivityGroups
ConfigActivityGroupVM
为ConfigActivityGroups
. _ ConfigActivityGroupVM
还CollectionViewSource
为 ObservableList<ConfigActivityGroup> 保留一个并提供一个供ICollectionView
UI 访问。
我还没有完成 UI,但我计划ICollectionViewSource
绑定到一个列表,用户可以从中单击一个项目;并看到一个带有 GroupName 的文本框,以及与第一个列表相邻的另一个Activities
列表ActivityGroup
。
这一切都很好,因为我有一个ConfigActivityGroup
由ICollectionView
. 我可以使用 currentConfigActivityGroup
绑定到第二个 UI 列表以Activities
在 current中显示ConfigActivityGroup
。
问题: 当我想为CRUD
当前的活动构建命令时ConfigActivityGroup
。
如果Activities
在ConfigActivityGroup
a 中List<string>
并且我将它们直接绑定到 UI,那么我没有可以在 UI 中绑定到的“当前”活动的概念,以便我可以DeleteCurrentActivityCommand
在 VM 中使用命令删除当前活动对于当前命令。
我的第一个解决方案是,在 VM 中选择 aConfigActivityGroup
后(通过 ICollectionView),将所选活动中的活动复制ConfigActivityGroup
到 VM 中的新活动ObservableCollection<string>
中(这又具有它自己的ViewSource
and ICollectionView
)。然后,我可以让 UI 第二个列表绑定到当前活动的 ICollectionView ConfigActivityGroup
。因此,我的命令将修改活动的 ICollectionView。但是,当我尝试为当前的新活动创建一个新活动时遇到了障碍,ConfigActivityGroup
我无法将活动设置ICollectionView.CurrentItem
为不同的活动字符串(因为它是只读的)。
我认为一个解决方案是在一个ActivityString
类中将活动字符串装箱有一个字符串。总的来说,我对这种方法不太满意。
我认为的第二个解决方案是使List<string>
inConfigActivityGroup
成为ObservableCollection<string>
. 这将简化虚拟机。我犹豫使用这种方法,因为模型是通过魔术(MyCouch + CouchDB)从非UI线程从数据库加载的json-deserialisation
,然后当ObservableCollection
从与其创建线程不同的线程访问时出现问题(我认为,来自内存) . 我认为使用许多线程安全的 ObservableCollections 之一是矫枉过正的。
第三个解决方案我在写这个问题时想是把List<string>
活动的模型保留在ConfigActivityGroup
. 然后,在其ConfigActivityGroup
中选择a时,以活动的 直接作为源来ICollectionView
初始化 a 。这样,UI 可以直接绑定到活动,并且 UI 可以负责编辑实际的活动字符串;并且当前选择的活动的概念仍然存在,然后我可以使用命令将其删除。CollectionViewSource/ICollection
List<string>
我认为第三种方法是正确的方法,但我愿意听取社区的想法。这是我第一次使用 MVVM,我试图保持职责分离并尽可能多地使用命令。
额外数据:
- 一旦 ConfigActivityGroup 从数据库加载并放入 VM 中,除了 VM 本身之外的任何人都不会通过 UI 更改它。