Search code examples
wpfmvvmwpfdatagriddouble-click

WPF MVVM DataGrid DoubleClick not working when row is already selected


So I have a problem identical to this question. However, the solution to this appears to be Code-Behind (and is 4 years old) but I am using MVVM. Time may have brought about a better solution to this.

Does anyone know of a way to have the double click work on a DataGridRow after it has been selected?

Here is my XAML:

<DataGrid x:Name="ContactsResult" 
          AlternatingRowBackground="Transparent"
          AutoGenerateColumns="False" 
          BorderBrush="{StaticResource DarkBlueBrush}"
          BorderThickness="1"
          CanUserAddRows="False" 
          FontFamily="{StaticResource DefaultFont}"
          GridLinesVisibility="None"
          HeadersVisibility="Column"
          IsReadOnly="True"
          ItemsSource="{Binding Results, Mode=TwoWay}"
          SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
          >

          <DataGrid.InputBindings>
              <MouseBinding Gesture="LeftDoubleClick" 
                            Command="{Binding DetailsCommand}"
                            CommandParameter="{Binding ElementName=ContactsResult, Path=SelectedItem.ContactId}"
                            />
          </DataGrid.InputBindings>

          <DataGrid.Columns>
              <DataGridTextColumn x:Name="contactLastNameColumn" 
                                  Binding="{Binding Name_LastSufFirstMidSal}"
                                  ElementStyle="{StaticResource dgCellPadding5}"                      Header="Contact Name" 
                                  Width="Auto" 
                                  />
              <DataGridTextColumn x:Name="companyNameColumn"
                                  ElementStyle="{StaticResource dgCellPadding5}"                      Header="Company Name"
                                  Width="Auto"
                                  />
              <DataGridTextColumn x:Name="CityColumn" 
                                  Binding="{Binding MailingAddress.City}" 
                                  ElementStyle="{StaticResource dgCellPadding5}"                      Header="Mailing City"
                                  Width="Auto"
                                  />
              <DataGridTextColumn x:Name="StateColumn" 
                                  Binding="{Binding MailingAddress.StateOrProvince}"      ElementStyle="{StaticResource dgCellPadding5}"                      Header="Mailing State" 
                                  Width="Auto"
                                  />
          </DataGrid.Columns>
</DataGrid>

EDIT

ElementSytle

<Style x:Key="dgCellPadding5" TargetType="{x:Type TextBlock}">
    <Setter Property="Margin" Value="5" />
</Style>

Solution

  • So in order to reach my goal, I decided to go a different route.

    First I started with a Grid and used the attribute Grid.IsSharedSizeScope="True". In this grid I created a grid and an ItemsControl (with a grid in the datatemplate). This gives me the appearance of a datagrid.

    Second, in the itemscontrol I added InputBindings to each item to achieve the desired behaviour. Here is what I came up with:

            <Border Grid.Row="2"
                    BorderBrush="{StaticResource BackgroundTitleBarBrush}"
                    BorderThickness="1"
                    Visibility="{Binding ResultGridVisible, Converter={local:BooleanToVisibilityValueConverter}, ConverterParameter=True}"
                        >
    
                <Grid Background="White" 
                  Grid.Row="2"
                  Grid.IsSharedSizeScope="True"
                  >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
    
                    <Border BorderBrush="{StaticResource SeperatorDarkBlueBrush}" 
                        BorderThickness="0 0 0 1"
                        Margin="5 0"
                        Padding="3 5"
                        Grid.Row="0">
                        <Grid VerticalAlignment="Center">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition SharedSizeGroup="A" Width="150"/>
                                <ColumnDefinition SharedSizeGroup="B" Width="200"/>
                                <ColumnDefinition SharedSizeGroup="C" Width="100"/>
                                <ColumnDefinition SharedSizeGroup="D" Width="75"/>
                                <ColumnDefinition SharedSizeGroup="E" Width="100"/>
                                <ColumnDefinition SharedSizeGroup="F" Width="50"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
    
                            <TextBlock FontWeight="Bold"
                                       Foreground="{StaticResource BackgroundTitleBarBrush}"
                                       Grid.Column="0"
                                       Text="Contact Name"
                                       />
                            <TextBlock FontWeight="Bold"
                                       Foreground="{StaticResource BackgroundTitleBarBrush}"
                                       Grid.Column="1"
                                       Text="Company Name"
                                       />
                            <TextBlock FontWeight="Bold"
                                       Foreground="{StaticResource BackgroundTitleBarBrush}"
                                       Grid.Column="2"
                                       Grid.ColumnSpan="2"
                                       Text="Mailing"
                                       />
                            <TextBlock FontWeight="Bold"
                                       Foreground="{StaticResource BackgroundTitleBarBrush}"
                                       Grid.Column="2"
                                       Grid.Row="1"
                                       Text="City"
                                       />
                            <TextBlock FontWeight="Bold"
                                       Foreground="{StaticResource BackgroundTitleBarBrush}"
                                       Grid.Column="3"
                                       Grid.Row="1"
                                       Text="State"
                                       />
                            <TextBlock FontWeight="Bold"
                                       Foreground="{StaticResource BackgroundTitleBarBrush}"
                                       Grid.Column="4"
                                       Grid.ColumnSpan="2"
                                       Text="Other"
                                       />
                            <TextBlock FontWeight="Bold"
                                       Foreground="{StaticResource BackgroundTitleBarBrush}"
                                       Grid.Column="4"
                                       Grid.Row="1"
                                       Text="City"
                                       />
                            <TextBlock FontWeight="Bold"
                                       Foreground="{StaticResource BackgroundTitleBarBrush}"
                                       Grid.Column="5"
                                       Grid.Row="1"
                                       Text="State"
                                       />
                        </Grid>
                    </Border>
    
                    <ScrollViewer Grid.Row="1" 
                                  HorizontalScrollBarVisibility="Disabled"
                                  MaxHeight="350"                              
                                  VerticalScrollBarVisibility="Auto" 
                                  >
                        <ItemsControl ItemsSource="{Binding Results}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Border x:Name="Container" 
                                            BorderBrush="{StaticResource SeperatorLightBlueBrush}" 
                                            BorderThickness="0 0 0 1"
                                            Margin="5 0"
                                            Padding="3 5"
                                            >
                                        <Border.InputBindings>
                                            <MouseBinding MouseAction="LeftClick"
                                                          Command="{Binding Path=DataContext.DetailsCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:BasePage}}}"
                                                          CommandParameter="{Binding ContactId}"
                                                          />
                                            <MouseBinding MouseAction="RightClick"
                                                          Command="{Binding Path=DataContext.NewWindowDetailsCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:BasePage}}}"
                                                          CommandParameter="{Binding ContactId}"
                                                          />
                                        </Border.InputBindings>
    
                                        <Grid VerticalAlignment="Center">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition SharedSizeGroup="A"/>
                                                <ColumnDefinition SharedSizeGroup="B"/>
                                                <ColumnDefinition SharedSizeGroup="C"/>
                                                <ColumnDefinition SharedSizeGroup="D"/>
                                                <ColumnDefinition SharedSizeGroup="E"/>
                                                <ColumnDefinition SharedSizeGroup="F"/>
                                            </Grid.ColumnDefinitions>
    
                                            <TextBlock FontFamily="{StaticResource DefaultFont}" 
                                                       Grid.Column="0"
                                                       Text="{Binding Name_LastSufFirstMidSal}"
                                                       VerticalAlignment="Center"
                                                       />
                                            <TextBlock FontFamily="{StaticResource DefaultFont}" 
                                                       Grid.Column="1"
                                                       Text="{Binding Company}"
                                                       VerticalAlignment="Center"
                                                       />
                                            <TextBlock FontFamily="{StaticResource DefaultFont}" 
                                                       Grid.Column="2"
                                                       Text="{Binding MailingAddress.City}"
                                                       VerticalAlignment="Center"
                                                       />
                                            <TextBlock FontFamily="{StaticResource DefaultFont}" 
                                                       Grid.Column="3"
                                                       Text="{Binding MailingAddress.StateOrProvince}"
                                                       VerticalAlignment="Center"
                                                       />
                                            <TextBlock FontFamily="{StaticResource DefaultFont}" 
                                                       Grid.Column="4"
                                                       Text="{Binding OtherAddress.City}"
                                                       VerticalAlignment="Center"
                                                       />
                                            <TextBlock FontFamily="{StaticResource DefaultFont}" 
                                                       Grid.Column="5"
                                                       Text="{Binding OtherAddress.StateOrProvince}"
                                                       VerticalAlignment="Center"
                                                       />
                                        </Grid>
                                    </Border>
    
                                    <DataTemplate.Triggers>
                                        <Trigger Property="IsMouseOver" Value="True">
                                            <Setter TargetName="Container" Property="Background" Value="{StaticResource BackgroundLightBlueBrush}"/>
                                        </Trigger>
                                    </DataTemplate.Triggers>
    
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </ScrollViewer>
    
                    <Border Grid.Row="1" Panel.ZIndex="1" Visibility="{Binding NoRecordsFound, Converter={local:BooleanToCollapsedVisibilityValueConverter}, ConverterParameter=True, Mode=TwoWay}">
                        <TextBlock Text="No Records Found"
                                   Margin="5 0"
                                   Padding="3 5"
                                   />
                    </Border>
    
                </Grid>
    
            </Border>