希望这是一个简单的MVVM问题,但我正在尝试掌握命令参数。
我让用户从ListBox中选择一个项目,然后单击“删除所选项”。 ListBox将SelectedItem绑定到“SelectedTemplate”。我的按钮XAML看起来像这样:
<Button CommandParameter="{Binding SelectedTemplate}" Command="{Binding DeleteTemplateCommand}" Content="Delete Selected"/>
当我进入执行命令时,我正在从命令中读取参数。但是,我也可以访问“SelectedTemplate”。如果我使用传递的参数,那么我必须在删除对象之前将其转换为正确的对象类型,而不是仅仅继续并删除“selectedTemplate”
public void DeleteTemplate(object template)
{
Convert.ChangeType(template, typeof(Template));
if (template == SelectedTemplate )
{
_ESTContext.Templates.Remove(SelectedTemplate);
}
}
我的问题是,对我而言,似乎既满足了MVVM的理念,使用其中一种还是有益处吗?
答案 0 :(得分:2)
唯一真正的区别在于可读性(可能还有一个额外的绑定,引擎必须进行评估,但在这种情况下,这并不会真正伤害到你)。
你正在使用SelectedTemplate
,所以我不打算将它绑定到参数并直接使用它。
除非这是您使用SelectedTemplate
的唯一内容,在这种情况下我会将其作为变量抛出,并直接绑定到选择:
<Button CommandParameter="{Binding ElementName=MyListBox, Path=SelectedItem}" Command="{Binding DeleteTemplateCommand}" Content="Delete Selected"/>
答案 1 :(得分:2)
使用命令参数的主要好处是,您可以针对不同的输入执行相同的命令,而不是一个硬编码的输入。能够删除任何项目可以说比仅仅删除SelectedTemplate
更灵活。在实践中,我倾向于使用参数。
您可以使用通用命令实现(例如RelayCommand<TParameter>
)来避免“执行”回调中的强制转换。
答案 2 :(得分:1)
我的问题是,对我而言似乎都满足了MVVM 哲学,使用其中一种是有益还是有害?
@MikeStrobel为你提供了一个使用参数的好参数,所以我猜你需要有人争论使用VM属性!
你是正确的,因为它们都满足MVVM,所以它实际上只取决于你希望你的应用程序如何工作。
在我们的具有此类功能的应用中,我们的SelectedTemplate
概念是用户界面如何运作的关键。将绑定到该属性的NullToVisibility/Boolean
转换器指示某些控件是启用还是可见。无论您选择了什么东西,细节部分,命令按钮和各种其他工作流程都会挂起。考虑到此工作流程,拥有有效SelectedTemplate
会激活DeleteTemplate
按钮。因此,对于我们来说,DeleteTemplateCommand
等命令都可以在SelectedTemplate
对象上运行。这意味着我们不需要传递命令参数。
对于我们来说,对SelectedTemplate
以外的某些内容执行操作(例如删除)并不合理。对于您的应用和用户界面,它可能会。