如何在DataGrid中执行LeftDoubleClick

时间:2016-09-01 12:26:10

标签: c# wpf datagrid mouseevent

我实施了:

    <DataGrid Name="DataGridProcesso" AutoGenerateColumns="False" ItemsSource="{Binding  CollectionView}"  CanUserReorderColumns="False" CanUserSortColumns="True" AlternatingRowBackground="#D1DFE7" IsSynchronizedWithCurrentItem="True">
          <DataGrid.InputBindings>
              <MouseBinding MouseAction="LeftDoubleClick" 
              Command="{Binding ItemDoubleClickCommand}" />
          </DataGrid.InputBindings>
    ...

但是,如果我点击六次(3次双击),则DoubleClick才有效 我认为第一次点击发生在内部单元格中,在单元格之后,最后发生在行中(我只想,我还不确定),我只想在单元格触发事件时发生LeftDoubleClick。

有什么问题?

我的DataGrid完整代码:

<DataGrid Name="DataGridProcesso" AutoGenerateColumns="False" ItemsSource="{Binding  CollectionView}"  CanUserReorderColumns="False" CanUserSortColumns="True" AlternatingRowBackground="#D1DFE7" IsSynchronizedWithCurrentItem="True">
            <DataGrid.InputBindings>
                <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding ItemDoubleClickCommand}" />
            </DataGrid.InputBindings>
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="Padding" Value="0,10,0,10" />
                    <Setter Property="BorderBrush" Value="Transparent"/>
                    <Setter Property="BorderThickness" Value="0,0,0,0"/>
                </Style>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="BorderBrush" Value="#CCC"/>
                    <Setter Property="BorderThickness" Value="0,0,1,0"/>
                    <Setter Property="Cursor" Value="Hand" />
                    <Setter Property="FontFamily" Value="Segoe" />
                    <Setter Property="FontSize" Value="14" />
                </Style>
            </DataGrid.Resources>

            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Data" Width="Auto" HeaderStyle="{StaticResource DataGridColumnHeaderStyle}">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Label Content="{Binding Path=Data,Mode=OneTime}" ToolTip="Data" HorizontalAlignment="Right"></Label>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="Número"  Width="Auto" HeaderStyle="{StaticResource DataGridColumnHeaderStyle}">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Label Content="{Binding Path=Numero,Mode=OneTime}" ToolTip="Número"></Label>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="Descrição"  Width="*" HeaderStyle="{StaticResource DataGridColumnHeaderStyle}">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Label Content="{Binding Path=Descricao, Mode=OneTime}" ToolTip="Descrição"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="Andamento"  Width="Auto" HeaderStyle="{StaticResource DataGridColumnHeaderStyle}">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Label Content="{Binding Path=Andamento.Descricao, Mode=OneTime}" ToolTip="Andamento"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="Lembrete"  Width="Auto" HeaderStyle="{StaticResource DataGridColumnHeaderStyle}">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Label Content="{Binding Path=Lembrete, Mode=OneTime}" ToolTip="Lembrete"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

ViewModel的一部分:

private ObservableCollection<Processo> _processos;
    public ObservableCollection<Processo> Processos
    {
        get { return _processos; }
        set
        {
            if (value != _processos)
            {
                _processos = value;
                NotifyPropertyChanged(nameof(Processos));
            }
        }
    }

    private ICollectionView _collectionView;
    public ICollectionView CollectionView
    {
        get
        {
            return _collectionView;
        }
        set
        {
            _collectionView = value;
            NotifyPropertyChanged(nameof(CollectionView));
        }
    }

    public ICommand ItemDoubleClickCommand => new Command<MainWindowViewModel>(a =>
    {
        AlterarProcesso((Processo)CollectionView.CurrentItem);
    });

1 个答案:

答案 0 :(得分:0)

尝试将IsSynchronizedWithCurrentItem="True"添加到您的DataGrid媒体资源中。
然后添加CommandParameter="{Binding CollectionView/}"

 <DataGrid Name="DataGridProcesso" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" ItemsSource="{Binding  CollectionView}"  CanUserReorderColumns="False" CanUserSortColumns="True" AlternatingRowBackground="#D1DFE7" IsSynchronizedWithCurrentItem="True">
      <DataGrid.InputBindings>
          <MouseBinding MouseAction="LeftDoubleClick" 
          Command="{Binding ItemDoubleClickCommand}"
          CommandParameter="{Binding CollectionView/}"/>
      </DataGrid.InputBindings>

注意/中的CommandParameter这可确保它绑定到当前项目。 然后,当它与IsSynchronizedWithCurrentItem="True"一起使用时,它会确保它与所选项目绑定。