【问题标题】:Silverlight MVVM: where did my (object sender, RoutedEventArgs e) go?Silverlight MVVM:我的(对象发送者,RoutedEventArgs e)去哪儿了?
【发布时间】:2011-06-02 23:22:51
【问题描述】:

我在视图模型中使用命令来处理事件。例如,我正在处理这样的按钮单击事件:

XAML

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

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

视图模型代码

   public ICommand mvvmButtonclick
    {
        get;
        private set;
    }

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

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

在按钮点击时调用的视图模型中的实际方法

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

这行得通。所以我的问题是:

  • 这是正确的方法吗?
  • 有没有一种方法可以将 (object sender, RoutedEventArgs e) 参数传播到我的视图模型中,我是否应该关心它是否不存在?
  • 假设这是一个列表框选择更改事件而不是按钮单击。没有object sender,SelectionChangedEventArgs e参数如何获取选中项的值?

【问题讨论】:

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


    【解决方案1】:

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

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

    如果 ViewModel 确实需要在调用命令期间提供 EventArgs 的特定派生词,那么这会使设计人员手忙脚乱。它将在视图和视图模型之间创建交互触发渴望消除的那种耦合。

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

    【讨论】:

      【解决方案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 类来编辑列表框中的选定项目。我想这就是你要找的东西!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-24
        • 2010-10-31
        • 2020-01-31
        • 1970-01-01
        • 2017-02-06
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多