C# 将选定项作为命令参数传递,而不是使用绑定的ViewModel对象(MVVM)

C# 将选定项作为命令参数传递,而不是使用绑定的ViewModel对象(MVVM),c#,wpf,mvvm,relaycommand,C#,Wpf,Mvvm,Relaycommand,希望这是一个简单的MVVM问题,但我正在努力掌握命令参数 我让用户从列表框中选择一个项目,然后单击“删除选定项”。列表框将SelectedItem绑定到“SelectedTemplate”。我的按钮XAML看起来是这样的: <Button CommandParameter="{Binding SelectedTemplate}" Command="{Binding DeleteTemplateCommand}" Content="Delete Selected"/> 我这里的问题是

希望这是一个简单的MVVM问题,但我正在努力掌握命令参数

我让用户从列表框中选择一个项目,然后单击“删除选定项”。列表框将SelectedItem绑定到“SelectedTemplate”。我的按钮XAML看起来是这样的:

<Button CommandParameter="{Binding SelectedTemplate}" Command="{Binding DeleteTemplateCommand}" Content="Delete Selected"/>

我这里的问题是,对我来说,它似乎都满足了MVVM的理念,使用其中一个是否有好处/坏处?

唯一真正的区别是可读性(以及引擎可能需要评估的一个额外绑定,但在这种情况下这不会真正伤害您)

您使用的是
SelectedTemplate
,因此我不需要将它绑定到参数并直接使用它

除非这是您唯一使用的
SelectedTemplate
,在这种情况下,我会将其作为变量丢弃,并直接绑定到所选内容:

<Button CommandParameter="{Binding ElementName=MyListBox, Path=SelectedItem}" Command="{Binding DeleteTemplateCommand}" Content="Delete Selected"/>

使用命令参数的主要好处是,您可以针对不同的输入执行相同的命令,而不是一个硬编码输入。可以说,能够删除任何项目比只删除
SelectedTemplate
更灵活。实际上,我倾向于使用参数

通过使用通用命令实现(例如
RelayCommand
),可以避免在“execute”回调中强制转换

我的问题是,在我看来,这两种方法都能满足MVVM的要求 哲学,使用一个或另一个有好处/坏处吗

@MikeStrobel为使用参数提供了一个很好的论据,所以我想您需要有人为使用VM属性而争论

你是正确的,因为两者都满足MVVM,所以实际上,这取决于你希望你的应用程序如何工作

在我们具有此类功能的应用程序中,我们的
SelectedTemplate
概念是UI工作方式的关键。将有
NullToVisibility/Boolean
转换器绑定到该属性,指示某些控件是启用的还是可见的。无论您是否选择了某个对象,细节部分、命令按钮和各种其他工作流都会挂起。考虑到此工作流,选择有效的
模板
将激活
删除模板
按钮。因此,对我们来说,我们的命令,如
deletemplateCommand
都将在
SelectedTemplate
对象上运行是有意义的。这意味着我们不需要传递命令参数


对我们来说,对非
SelectedTemplate
的内容执行操作(如删除)是没有意义的。对于您的应用程序和用户界面,它可能会

嗯,这是一个很好的观点。但是,我仍然必须去获取type()参数,以便从正确的模型中正确地删除它,对吗?泛型
RelayCommand
将接受具有预期参数类型的回调(无论
T
的类型是什么),并且应该在调用回调之前将参数强制转换为该类型。所以,不,你不需要自己做任何转换。我必须去研究如何实现回调。。。谢谢你,我想我现在有点迷路了。。。我有公共RelayCommand DeleteTemplateCommand{get{if({u DeleteTemplateCommand==null){{u DeleteTemplateCommand=new RelayCommand(DeleteTemplate,p=>true);}返回{u DeleteTemplateCommand;}但它仍然是“对象”类型。我正在删除“Model”或“Template”对象-如何将命令类型设置为正确的对象?返回原始实现,将
RelayCommand
替换为
RelayCommand
,并将
deletemplate()
中的参数从
object
更改为
Template
<Button CommandParameter="{Binding ElementName=MyListBox, Path=SelectedItem}" Command="{Binding DeleteTemplateCommand}" Content="Delete Selected"/>