wpf 如何创建带参数的CommandBinding?

zf9nrax1  于 2022-12-19  发布在  其他
关注(0)|答案(3)|浏览(194)

有没有办法创建一个带参数的CommandBinding?你通常可以像这样为控件的命令添加绑定:

<Control.CommandBindings>
          <CommandBinding Command="ApplicationCommands.XXX" CanExecute="XXX_CanExecute"
                    Executed="XXX_Executed">
          </CommandBinding>
    </Control.CommandBindings>

我想知道是否也有一种传递参数的方法?

fjaof16o

fjaof16o1#

不,您在CommandBinding上没有CommandParameter,但是您可以使用UIElement中的InputBindings来添加例如MouseBinding,它具有CommandCommandParameter属性。

<Control>
  <Control.InputBindings>
    <MouseBinding MouseAction="LeftClick"
                  Command="{StaticResource MyCommand}"
                  CommandParameter="{x:Static system:Boolean.TrueString}"/>
    </Control.InputBindings>
</Control>
doinxwow

doinxwow2#

必须将参数值赋给调用命令的元素的ICommandSource.CommandParameter属性(例如Button.CommandParameter)。此属性也接受Binding
可以从ExecutedRoutedEventArgs.ParameterCanExecuteRoutedEventArgs.Parameter属性中检索该参数。

<Window>
  <Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Delete"                
                    CanExecute="DeleteCommand_CanExecute"
                    Executed="DeleteCommand_Executed" />
    </Control.CommandBindings>
  </Window.CommandBindings>

  <Button Content="X" 
          Command="{x:Static ApplicationCommands.Delete}"
          CommandParameter="abc" />
</Window>
private void DeleteCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
  var commandParameter = e.Parameter as string; // Returns "abc"
}

private void DeleteCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
  var commandParameter = e.Parameter as string; // Returns "abc"
}

当点击ButtonICommandSource时,它会将路由的命令和命令参数一起发送到逻辑树中,CommandBinding可以捕获这个事件并使用注册的处理程序处理它。
关键是命令源必须定义命令参数,而不是CommandBinding,这样,同一个CommandBinding可以处理发送不同命令参数的不同命令源。

chy5wohz

chy5wohz3#

您是否尝试过CommandParameter属性?

<DataGrid.ContextMenu>
     <ContextMenu>
           <MenuItem Header="MyHeader" 
                     Command="{Binding MyCommand}"
                     CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem}" />
</DataGrid.ContextMenu>

相关问题