代码之家  ›  专栏  ›  技术社区  ›  Nekeniehl

将事件绑定到没有Blend SDK或第三方的命令。(WPF/MVVM)

  •  0
  • Nekeniehl  · 技术社区  · 7 年前

    有没有办法将事件绑定到命令 没有 System.Windows.Interactivity 或任何其他第三方库?

    到目前为止,我尝试了以下方法:

    <Style TargetType="DataGridRow">
          <EventSetter Event="MouseDoubleClick"
          Handler="{Binding DoubleClickCommand}" />
    </Style>
    

    <DataGrid.InputBindings>
          <MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}"/>
    </DataGrid.InputBindings>
    

    <DataGrid ItemsSource="{Binding Model.SpectrumCollections}"
              ColumnWidth="*"
              AutoGenerateColumns="false"
              IsReadOnly="True" 
              BorderThickness="0"
              HeadersVisibility="Column" MouseDoubleClick="{Binding DoubleClickCommand}">
    

    但似乎什么都不管用,任何帮助都将不胜感激。

    编辑1: 这是我使用的RelayCommand的实现,也许问题就在这里。。

    public class RelayCommand : ICommand
    {
        private readonly Func<bool> _canExecute;
    
        private readonly Action _execute;
    
        public RelayCommand(Action inExecute, Func<bool> inCanExecute = null)
        {
            _execute = inExecute ?? throw new Helper.Exceptions.DelegateCommandException(
                           Exceptions.InExecuteIsNullException);
            _canExecute = inCanExecute;
        }
    
        public event EventHandler CanExecuteChanged
        {
            add => CommandManager.RequerySuggested += value;
            remove => CommandManager.RequerySuggested -= value;
        }
    
        public bool CanExecute(object inObject) => _canExecute?.Invoke() ?? true;
    
        public void Execute(object inObject) => _execute?.Invoke();
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   mm8    7 年前

    您无法执行以下操作,因为 MouseDoubleClick 是en事件,而不是依赖项属性:

    MouseDoubleClick="{Binding DoubleClickCommand}">
    

    您可以绑定到 Command a的属性 MouseBinding 尽管:

    <DataGrid.InputBindings>
        <MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}"/>
    </DataGrid.InputBindings>
    

    如果要在双击单元格时调用该命令,应添加 鼠标绑定 DataGridCell :

    <DataGrid x:Name="dg" AutoGenerateColumns="False">
        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridCell}">
                            <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
                                    <ContentPresenter.InputBindings>
                                        <MouseBinding Gesture="LeftDoubleClick"
                                                      Command="{Binding DataContext.DoubleClickCommand,RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                                    </ContentPresenter.InputBindings>
                                </ContentPresenter>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.CellStyle>
        <DataGrid.InputBindings>
            <MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}"/>
        </DataGrid.InputBindings>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
        </DataGrid.Columns>
    </DataGrid>