Silverlight MVVM:我的(对象发送者,RoutedEventArgs e)去了哪里?

时间:2011-01-03 17:38:42

标签: silverlight mvvm silverlight-4.0 event-handling icommand

我在viewmodel中使用命令来处理事件。比如我正在处理像这样的按钮点击事件:

XAML

            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <i:InvokeCommandAction Command="{Binding mvvmButtonclick}" />

                </i:EventTrigger>
            </i:Interaction.Triggers>

Viewmodel代码

   public ICommand mvvmButtonclick
    {
        get;
        private set;
    }

Viewmodel用于连接命令的构造函数代码

this.mvvmButtonclick = new ActionCommand(this.ButtonClickedEvent);

在点击按钮时调用的viewmodel中的实际方法

   private void ButtonClickedEvent()
    {
        MessageBox.Show("worked!!!");
    }

这很有效。所以我的问题是:

  • 这是正确的方法吗?
  • 有没有办法可以将(对象发送者,RoutedEventArgs e)参数传播到我的viewmodel中,我应该关心它不在那里吗?
  • 假设这是列表框选择更改事件而不是按钮单击。如何在没有对象发件人,SelectionChangedEventArgs e 参数的情况下获取所选项目的值?

2 个答案:

答案 0 :(得分:3)

我认为您可能忽略了交互触发器旨在提供的视图和视图模型之间的分离点。

交互触发器的目的是允许设计器(通常使用Blend)在视图模型上调用命令。哪个UI元素和UI元素上的哪个事件可以调用这样的命令是设计器选项。

如果ViewModel确实要求在调用命令期间提供EventArgs的特定衍生物,那么这将使设计师的手稍微束缚。它会在视图和视图模型之间创建一种耦合,即交互触发器希望消除它。

关于最后一个问题,确定列表框中当前所选项目并在更改时收到通知的方法是在视图模型上创建一个绑定到SelectedItem的属性的方法。列表框。对于这类事情,不需要员工交互触发器或命令。

答案 1 :(得分:2)

有一些框架(例如Catel)允许转发EventArgs。例如,请参阅此实现:

http://catel.codeplex.com/SourceControl/changeset/view/508b404f2c57#src%2fCatel.Windows35%2fMVVM%2fCommands%2fCommand.cs

该类与Silverlight和WPF兼容。

如果您不想使用EventArgs,则需要在ViewModel上创建SelectedObject属性并将其绑定到列表框的SelectedItem。

Catel包括2个示例应用程序(在WPF和Silverlight中),它们使用MVVM和EventToCommand类来编辑列表框中的选定项目。我认为这就是你要找的东西!