首页 > 解决方案 > 已选择行时,WPF MVVM DataGrid DoubleClick 不起作用

问题描述

所以我有一个与这个问题相同的问题。但是,对此的解决方案似乎是代码隐藏(并且已有 4 年历史),但我使用的是 MVVM。时间可能已经为这个问题带来了更好的解决方案。

有谁知道在选择 DataGridRow 后双击它的方法?

这是我的 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>

编辑

元素样式

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

标签: wpfmvvmwpfdatagriddouble-click

解决方案


所以为了达到我的目标,我决定走一条不同的路。

首先,我从 Grid 开始并使用属性 Grid.IsSharedSizeScope="True"。在这个网格中,我创建了一个网格和一个 ItemsControl(在数据模板中有一个网格)。这给了我一个数据网格的外观。

其次,在 itemscontrol 中,我向每个项目添加了 InputBindings 以实现所需的行为。这是我想出的:

        <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>

推荐阅读