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
最明显的方法似乎是AddItemCommand
和MasterViewModel
中的RemoveItemCommand
,但是在这种情况下如何进行数据绑定?控件的 DataContext 切换为 collection,因此我不再能从单个项目级别看到该命令。我看到了一个绑定技巧,它可以找到祖先的 DataContext,但至少可以说它看起来很老套或不直观。这是首选解决方案还是有更好的方法?
AddItemCommand
绝对属于 MasterViewModel
,因为它不能是对单个项目的操作。
RemoveItemCommand
也属于 MasterViewModel
,因为它将更新项目列表。但是,绑定不遵循基本方法。
- 假设触发命令的按钮是项目模板的一部分,那么您必须使用相对绑定来定位命令(这就是您所说的 'hacky' 吗?)
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.RemoveItemCommand}"
- 你必须告诉命令要删除哪个项目
CommandParameter="{Binding}"
并在与您的命令对应的方法中使用此参数。
假设我有 MasterViewModel
,其中包含 collection 个 ItemModel
。如果我想将新的 ItemModel
添加到我的 collection,我会把 AddItemCommand
放在那个 MasterViewModel
中。现在,如果我想在每个项目旁边显示一个删除按钮,我应该把这个命令放在哪里?肯定不在 ItemModel
?!
我是否需要创建几乎相同的 ItemModel
副本,例如 ItemViewModel
?这听起来像很多 prop-ing 工作,但即使那样我也不确定该命令如何能够从 collection.
ItemModel
最明显的方法似乎是AddItemCommand
和MasterViewModel
中的RemoveItemCommand
,但是在这种情况下如何进行数据绑定?控件的 DataContext 切换为 collection,因此我不再能从单个项目级别看到该命令。我看到了一个绑定技巧,它可以找到祖先的 DataContext,但至少可以说它看起来很老套或不直观。这是首选解决方案还是有更好的方法?
AddItemCommand
绝对属于 MasterViewModel
,因为它不能是对单个项目的操作。
RemoveItemCommand
也属于 MasterViewModel
,因为它将更新项目列表。但是,绑定不遵循基本方法。
- 假设触发命令的按钮是项目模板的一部分,那么您必须使用相对绑定来定位命令(这就是您所说的 'hacky' 吗?)
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.RemoveItemCommand}"
- 你必须告诉命令要删除哪个项目
CommandParameter="{Binding}"
并在与您的命令对应的方法中使用此参数。