WPF MVVM 困境 - 将作用于 collection 项的命令放在哪里?

WPF MVVM dilemma - Where to put the command that acts on collection item?

假设我有 MasterViewModel,其中包含 collection 个 ItemModel。如果我想将新的 ItemModel 添加到我的 collection,我会把 AddItemCommand 放在那个 MasterViewModel 中。现在,如果我想在每个项目旁边显示一个删除按钮,我应该把这个命令放在哪里?肯定不在 ItemModel?!

我是否需要创建几乎相同的 ItemModel 副本,例如 ItemViewModel?这听起来像很多 prop-ing 工作,但即使那样我也不确定该命令如何能够从 collection.

中删除 ItemModel

最明显的方法似乎是AddItemCommandMasterViewModel中的RemoveItemCommand,但是在这种情况下如何进行数据绑定?控件的 DataContext 切换为 collection,因此我不再能从单个项目级别看到该命令。我看到了一个绑定技巧,它可以找到祖先的 DataContext,但至少可以说它看起来很老套或不直观。这是首选解决方案还是有更好的方法?

AddItemCommand 绝对属于 MasterViewModel,因为它不能是对单个项目的操作。

RemoveItemCommand 也属于 MasterViewModel,因为它将更新项目列表。但是,绑定不遵循基本方法。

  1. 假设触发命令的按钮是项目模板的一部分,那么您必须使用相对绑定来定位命令(这就是您所说的 'hacky' 吗?)

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.RemoveItemCommand}"

  1. 你必须告诉命令要删除哪个项目

CommandParameter="{Binding}"

并在与您的命令对应的方法中使用此参数。