簡體   English   中英

在沒有Blend SDK或第三方的情況下將事件綁定到命令。 (WPF / MVVM)

[英]Binding Events to Commands without Blend SDK or third party. (WPF / MVVM)

沒有 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();
}

您不能執行以下操作,因為MouseDoubleClick是事件而不是依賴項屬性:

MouseDoubleClick="{Binding DoubleClickCommand}">

您可以通過以下方式綁定到MouseBindingCommand屬性:

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

如果要在雙擊單元格時調用該命令,則應將MouseBinding添加到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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM