将所选项目作为命令参数传递与使用绑定的ViewModel对象(MVVM)

时间:2014-08-22 17:05:10

标签: c# wpf mvvm relaycommand

希望这是一个简单的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的理念,使用其中一种还是有益处吗?

3 个答案:

答案 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以外的某些内容执行操作(例如删除)并不合理。对于您的应用和用户界面,它可能会。