WPF MVVM困境-将作用于集合项的命令放在何处?

WPF MVVM困境-将作用于集合项的命令放在何处?,wpf,mvvm,binding,Wpf,Mvvm,Binding,假设我有一个包含ItemModel集合的MasterViewModel。如果我想向集合中添加新的ItemModel,我会将addItem命令放在MasterViewModel中。现在,如果我想在每个项目旁边显示一个删除按钮,我会把这个命令放在哪里?当然不在项目模型中 我是否需要创建几乎相同的ItemModel副本,例如ItemViewModel?这听起来像是很多支撑工作,但即使如此,我也不确定该命令如何能够从集合中删除ItemModel 最明显的方法似乎是MasterViewModel中的Add

假设我有一个包含ItemModel集合的MasterViewModel。如果我想向集合中添加新的ItemModel,我会将addItem命令放在MasterViewModel中。现在,如果我想在每个项目旁边显示一个删除按钮,我会把这个命令放在哪里?当然不在项目模型中

我是否需要创建几乎相同的ItemModel副本,例如ItemViewModel?这听起来像是很多支撑工作,但即使如此,我也不确定该命令如何能够从集合中删除ItemModel

最明显的方法似乎是MasterViewModel中的AddItemCommand和RemoveItemCommand,但在这种情况下如何进行数据绑定?控件的DataContext被切换到集合,因此我不再能够从单个项级别看到该命令。我看到了一个绑定技巧,它可以找到祖先的数据上下文,但至少可以说,它看起来非常粗糙或不直观。这是首选解决方案还是有更好的方法?

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

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

假设触发命令的按钮是项模板的一部分,那么您必须使用相对绑定来定位命令,这就是您所说的“hacky”吗? Command={Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.removietemcommand}

您必须告诉命令要删除的项目 CommandParameter={Binding}


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

ViewModel用于命令以及视图和模型之间的其他绑定工作。。。模型是业务逻辑。因此,是的,您确实需要一个ItemViewModel,因为这两个命令都应该在承载命令应该操作的集合的视图模型中实现。不应将集合设置为DataContext。视图模型应该是DataContext。您只需通过调整Binding.Path来绑定到此视图模型的集合/属性。如果您需要帮助来修复DataContext,您应该发布当前的相关代码。关于delete命令:它实际上取决于您使用的数据视图。DataGrid已经公开了一个delete命令,这将为您节省一些工作。通常您必须将SelectedItem绑定到视图模型。单击项目或控件(如该项目内的删除按钮)时,将自动选择该项目。delete命令只需从源集合中删除SelectedItem。你真的应该发布相关代码。谢谢@BionicCode。我的首选是使用CommandParameter={Binding}而不是SelectedItem属性使用SelectedItem是错误的,因为您希望能够删除任何项目而不必选择它。我写的也是同样的东西。这是我应得的。是的,这就是我所指的约束。也许我应该说是非直觉的,不是粗俗的,但我认为这是正确的方法。非常感谢。