2

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

我有一个ConfigActivityGroup班级(模型)。它代表一组活动。一个用户可以有很多ActivityGroups,每个都包含组的名称和多个活动,这些活动是字符串。

我有一个ConfigActivityGroupVM提供 CRUD 的命令ConfigActivityGroups

ConfigActivityGroupVMConfigActivityGroups. _ ConfigActivityGroupVMCollectionViewSource为 ObservableList<ConfigActivityGroup> 保留一个并提供一个供ICollectionViewUI 访问。

我还没有完成 UI,但我计划ICollectionViewSource绑定到一个列表,用户可以从中单击一个项目;并看到一个带有 GroupName 的文本框,以及与第一个列表相邻的另一个Activities列表ActivityGroup

这一切都很好,因为我有一个ConfigActivityGroupICollectionView. 我可以使用 currentConfigActivityGroup绑定到第二个 UI 列表以Activities在 current中显示ConfigActivityGroup

问题: 当我想为CRUD当前的活动构建命令时ConfigActivityGroup

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

我的第一个解决方案是,在 VM 中选择 aConfigActivityGroup后(通过 ICollectionView),将所选活动中的活动复制ConfigActivityGroup到 VM 中的新活动ObservableCollection<string>中(这又具有它自己的ViewSourceand 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/ICollectionList<string>

认为第三种方法是正确的方法,但我愿意听取社区的想法。这是我第一次使用 MVVM,我试图保持职责分离并尽可能多地使用命令。

额外数据:

  • 一旦 ConfigActivityGroup 从数据库加载并放入 VM 中,除了 VM 本身之外的任何人都不会通过 UI 更改它。
4

0 回答 0