【问题标题】:Binding Events to Commands without Blend SDK or third party. (WPF / MVVM)在没有 Blend SDK 或第三方的情况下将事件绑定到命令。 (WPF/MVVM)
【发布时间】:2018-07-04 19:37:51
【问题描述】:

有没有办法将事件绑定到命令没有 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();
}

【问题讨论】:

  • 为什么你不想使用,已经制作好的包,这正是你所要求的?
  • 因为项目的要求之一是不使用第三方包,很遗憾。而且我相信实施起来应该不会那么难。
  • System.Windows.Interactivity 是 Blend SDK 的一部分。这是 WPF 应用程序的设计器软件。我不会将它归类为第三方包,因为它专门用于 Blend。现在我让它工作了,但是你必须为每个Cell 指定DataTemplate。只有当用户双击实际的DataGrid NOT Cell 时,您的第二次尝试才​​会起作用,这是有区别的。双击单元格触发编辑模式。
  • MouseBinding Command="{Binding DoubleClickCommand}" Gesture="LeftDoubleClick" 一切正常
  • 我明白你的观点@XAMlMAX,我完全理解重新发明轮子的含义,但我不是满足要求的人。

标签: c# wpf mvvm wpf-controls wpfdatagrid


【解决方案1】:

您不能执行以下操作,因为 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>

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 2014-09-01
    • 2015-11-24
    • 2011-04-04
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多