2017-07-12 24 views
0

我有一個DataGrid並希望在我的ViewModel中定義的命令在雙擊某行時執行。這在行已經被選中時工作,但是如果我雙擊一個當前未被選中的行,就不會這樣,即使我可以看到DataGrid的MouseDoubleClick事件觸發並且所需的行已成爲SelectedItem。這裏是我的DataGrid的定義:wpf datagrid鼠標綁定leftdoubleclick命令只適用於已經選擇的項目

<DataGrid Name="ProjectsList" Grid.Row="1" ItemsSource="{Binding FilteredProjects}" VerticalAlignment="Stretch" 
         HorizontalAlignment="Stretch" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" 
         SelectedItem="{Binding SelectedProject}" PreviewMouseDoubleClick="ProjectsList_PreviewMouseDoubleClick" 
         MouseDoubleClick="ProjectsList_MouseDoubleClick" > 
    <interactivity:Interaction.Behaviors> 
     <behaviours:DataGridSelectedProjectsBehaviour SelectedProjects="{Binding SelectedProjects}" /> 
    </interactivity:Interaction.Behaviors> 
    <DataGrid.InputBindings> 
     <KeyBinding Key="Delete" Command="{Binding DeleteCommand}" /> 
     <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding OpenCommand}" /> 
    </DataGrid.InputBindings> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Width="*"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Grid Margin="0,0,8,0"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="Auto" /> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition /> 
          <RowDefinition /> 
          <RowDefinition /> 
          <RowDefinition /> 
         </Grid.RowDefinitions> 

         <Rectangle Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2" Height="2"> 
          <Rectangle.Fill> 
           <LinearGradientBrush StartPoint="0,0" EndPoint="1,0"> 
            <GradientStop Color="{StaticResource SpruceGreen}" Offset="0" /> 
            <GradientStop Color="{StaticResource DarkGrey}" Offset="0.5" /> 
            <GradientStop Color="{StaticResource LightGrey}" Offset="1" /> 
           </LinearGradientBrush> 
          </Rectangle.Fill> 
         </Rectangle> 
         <TextBlock Grid.Column="0" Grid.Row="1" Text="{Binding Name}" FontWeight="Bold" /> 
         <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding State}" Foreground="Red" HorizontalAlignment="Right" Typography.Capitals="AllSmallCaps" /> 
         <TextBlock Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Text="{Binding Created, Converter={StaticResource StringFormat}, ConverterParameter='CREATED {0:dd/MM/yyyy HH:mm}'}" Foreground="Gray" FontSize="10" /> 
         <TextBlock Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" Text="{Binding Description}" TextWrapping="Wrap" Padding="0,0,0,32" /> 
        </Grid> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

下面是一些演示問題的日誌條目。請原諒我的調試日誌條目。以「>」結尾的日誌條目只是表示調用了方法([]中的名稱)。 這是當我雙擊當前未選中的行會發生什麼:

2017/07/12 16:35:52 DEBUG (ThreadId:1) [DataGridSelectedProjectsBehaviour.OnDataGridSelectionChanged] - > 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [SelectProjectViewModel.SelectedCollectionChanged] - > 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [SelectProjectViewModel.get_SelectedTotal] - > 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [DataGridSelectedProjectsBehaviour.ProjectsCollectionChanged] - > 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [SelectProjectViewModel.SelectedCollectionChanged] - > 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [SelectProjectViewModel.get_SelectedTotal] - > 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [DataGridSelectedProjectsBehaviour.ProjectsCollectionChanged] - > 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [SelectProjectPage.ProjectsList_PreviewMouseDoubleClick] - > 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [SelectProjectPage.ProjectsList_PreviewMouseDoubleClick] - SelectedItem is project [Project2] 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [SelectProjectPage.ProjectsList_MouseDoubleClick] - > 
2017/07/12 16:35:52 DEBUG (ThreadId:1) [SelectProjectPage.ProjectsList_MouseDoubleClick] - SelectedItem is project [Project2] 

這是當我雙擊行時當前選擇它會發生什麼:

2017/07/12 16:35:54 DEBUG (ThreadId:1) [SelectProjectPage.ProjectsList_PreviewMouseDoubleClick] - > 
2017/07/12 16:35:54 DEBUG (ThreadId:1) [SelectProjectPage.ProjectsList_PreviewMouseDoubleClick] - SelectedItem is project [Project2] 
2017/07/12 16:35:54 DEBUG (ThreadId:1) [<Open>d__35.MoveNext] - command was invoked. 
2017/07/12 16:35:54 INFO (ThreadId:1) [BaseViewModel.CheckForUnsavedChanges] - There are no unsaved changes. 
2017/07/12 16:35:54 DEBUG (ThreadId:1) [ProjectSummaryViewModel..ctor] - ViewModel was created. 
2017/07/12 16:35:54 DEBUG (ThreadId:1) [NavigationServiceEx.InternalNavigateTo] - SetParameter finished 
2017/07/12 16:35:54 DEBUG (ThreadId:1) [BaseViewModel.NavigatedFrom] - > 
2017/07/12 16:35:54 DEBUG (ThreadId:1) [SelectProjectPage.ProjectsList_MouseDoubleClick] - > 
2017/07/12 16:35:54 DEBUG (ThreadId:1) [SelectProjectPage.ProjectsList_MouseDoubleClick] - SelectedItem is project [Project2] 

由於你可以看到,如果該行已被選中,則執行打開命令。

我以爲DataGridSelectedProjectsBehaviour可能干擾MouseBinding,但是當我刪除它時,雙擊命令從不起作用。我真的不需要它,並想刪除它。當預計需要多行選擇時添加它。

任何建議將不勝感激。由於

回答

1

你可以嘗試處理MouseDoubleClick事件的DataGridRow容器,無論是從視圖的代碼隱藏調用命令:

<DataGrid Name="ProjectsList" Grid.Row="1" ItemsSource="{Binding FilteredProjects}" VerticalAlignment="Stretch" 
         HorizontalAlignment="Stretch" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" 
         SelectedItem="{Binding SelectedProject}" PreviewMouseDoubleClick="ProjectsList_PreviewMouseDoubleClick" 
         MouseDoubleClick="ProjectsList_MouseDoubleClick" > 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <EventSetter Event="MouseDoubleClick" Handler="OnItemMouseDoubleClick" /> 
     </Style> 
    </DataGrid.RowStyle> 
    ... 
</DataGrid> 

private void OnItemMouseDoubleClick(object sender, ouseButtonEventArgs e) 
{ 
    var vm = this.DataContext as YourViewModel; 
    vm.YourCommand.Execute(null); 
} 

或通過使用附加行爲基本上做同樣的事情:

<Style TargetType="DataGridRow"> 
    <Setter Property="local:YourType.YourAttachedCommandProperty" Value="{Binding DataContext.YourCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" /> 
</Style> 
+0

我會考慮這些替代品,但竟被d寧可弄清楚爲什麼MouseBinding不起作用,因爲它是更優雅的解決方案。我相信在後面的代碼中使用ViewModel類型與MVVM模式相反,我認爲附加的行爲對於已經有這樣一個簡單解決方案的東西來說是過分的。但我確實說過,任何建議,將不勝感激,他們是。所以如果我最終使用你的解決方案之一,我會將你標記爲答案。謝謝@ mm8。 – Kieran

+0

對不起,我不確定在回答答案時是否有必要這樣做。感謝您的鏈接。 @ MM8 – Kieran