如何将此事件处理程序转换为命令

本文关键字:程序转换 命令 事件处理 | 更新日期: 2024-10-19 09:36:46

private void GridSplitter_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    vm.positionX = e.GetPosition((sender as GridSplitter).Parent as UIElement).X;
}

父级是一个虚拟化堆栈面板。我有点理解命令背后的想法,但仍然无法理解如何实现它。此事件处理程序获取鼠标的 X 坐标并将其发送到视图模型的位置 X。如果我把它变成一个命令,我从哪里得到 sender 和 e 的信息?

如何将此事件处理程序转换为命令

通常,Commands用于类似按钮的控件,当用户与它们交互(单击按钮、点击它等(时触发。

根据您的应用程序设计和需求,Command具有CanExecuteExecuted处理程序或事件。这些允许您设置Command是否可以执行,以及执行时应该发生什么。

但是,您指的是PreviewMouseDown事件。您无法阻止系统触发此事件。因此,在这种情况下,新CommandCanExecute或多或少是无用的。

为了仍然实现您的目标,您可以使用 Ganesh 已经在评论中指出的EventToCommand机制。本文和下面的示例应该给你一个提示,它将如何工作:

<ResourceDictionary>
  <DataTemplate x:Key="PreviewMouseDownCommandTemplate">
    <StackPanel>
      <i:Interaction.Triggers>
        <i:EventTrigger EventName="PreviewMouseDown">
          <command:EventToCommand Command="{Binding MyCommandProvider.PreviewMouseDownCommand,
                                            Mode=OneWay,
                                            Source={StaticResource Locator}}"
                                  CommandParameter="{Binding Mode=OneWay}" />
        </i:EventTrigger>
      </i:Interaction.Triggers>
      <!-- Content -->
    </StackPanel>
  </DataTemplate>
</ResourceDictionary>