双击 ListView GridView 行的命令

Command for DoubleClick on ListView's GridView Row

在我的 WPF - MVVM 应用程序中,我有一个 ListView,其中有一个 GridView。 双击 GridView 中的一行时,我想阅读该行中一列中的文本。

我想使用命令来维护 MVVM 模式。

我知道可以使用 InputBindings 为 DoubleClick 事件设置一个命令。但是 GridView 没有 InputBindings。

知道如何实现功能吗??

谢谢


注意 - 想知道以上是否可以通过纯粹使用命令来实现 - 没有用于 DoubleClick 事件处理的代码隐藏?

我在我的 GridView 中为列使用了 CellTemplate,在该 celltemplate 中,我为双击事件提供了 InputBindings - MouseBinding。这会将双击事件变成命令,然后我将 Cell 的文本作为命令参数发送。

<ListView x:Name="listview1" ItemsSource="{Binding DataCollection}"  >

    <ListView.View>
        <GridView ColumnHeaderContainerStyle="{StaticResource ColumnHeaderStyle}">

            <GridViewColumn Header="ID"  Width="auto" DisplayMemberBinding="{Binding ID}" />
            <GridViewColumn Header="PrimaryFile"   Width="auto"  >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding PrimaryFile}">
                            <TextBlock.InputBindings>
                                <MouseBinding Gesture="LeftDoubleClick" Command="{Binding Path=DataContext.ShowFileCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" CommandParameter="{Binding PrimaryFile}"/>
                            </TextBlock.InputBindings>
                        </TextBlock>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>

</ListView>

在这里,用户控件的数据上下文被设置为一个视图模型,并且 ShowFileCommand 暴露在我的视图模型上。

所以双击第 2 列中的单元格时,命令与单元格中的文本一起作为命令参数出现

要获得 KhannaB7 的建议以处理网格视图中的所有列,您需要执行此操作

在您的资源中设置 DataTemplate

  <UserControl.Resources>
        <ResourceDictionary>
            <DataTemplate x:Key="GridViewCellTemplateStyle">
                <TextBlock Text="{Binding}">
                    <TextBlock.InputBindings>
                        <MouseBinding Gesture="LeftDoubleClick" Command="{Binding DataContext.CommandDoubleClick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"/>
                    </TextBlock.InputBindings>
                </TextBlock>
            </DataTemplate>
        </ResourceDictionary>
    </UserControl.Resources>

创建您的网格视图并使列继承此数据模板

 <ListView>
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="Auto" Header="Column1" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/>
                    <GridViewColumn Width="Auto" Header="Column2" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/>
                    <GridViewColumn Width="Auto" Header="Column3" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/>
                    <GridViewColumn Width="Auto" Header="Column4" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/>
                </GridView>
            </ListView.View>
        </ListView>

当然,您可以在模板中放入任何您想要的东西。我的只是展示了如何双击网格视图列行

我试图找到一个好的解决方案并尝试了这个,但遗憾的是它没有用。对于在同一条船上碰巧发现自己在这里的任何人,我发现了两种非常可靠的方法。有很多其他方法可以解决这个问题,但是我想避免使用任何额外的 DLL(也就是使用 interactivity)或其他框架。

附加行为

用户名 dlf 的用户在这里发布了一个很好的答案: GridView DoubleClick 他发布了一个很棒的附加行为,我已经在多种条件下对其进行了测试,效果非常好。

纯粹XAML

我个人在 XAML 中尽我所能。本质上,我为 ListViewItem 创建了一个 ControlTemplateControlTemplate 需要调整为既包含您想要的任何高亮颜色效果,也必须包含您选择的任何行的数据。关于这一点的重要部分是即使有多个列也能很好地工作。每个 Command.

还需要一个单独的 ControlTemplate

这是一个包含 2 列 ListView 和绑定到集合的渐变高亮效果的示例。在我的 ControlTemplate 中需要注意一件事,我设置 TextBlock 宽度以匹配列的宽度。

希望这对正在寻找的人有所帮助。

控制模板:

    <ControlTemplate x:Key="Selected_Item_Template" TargetType="{x:Type ListViewItem}">
        <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="19" Margin="0,0,0,0" BorderBrush="LightGray" BorderThickness="1">
            <Border.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF74A1C7" Offset="0.5"/>
                    <GradientStop Color="SteelBlue" Offset="0.5"/>
                </LinearGradientBrush>
            </Border.Background>
            <Border.InputBindings>
                <MouseBinding Gesture="LeftDoubleClick" 
                              CommandParameter="{Binding SelectedItems, ElementName=your_listview}"
                              Command="{Binding Path=DataContext.Some_DoubleClick_ICommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
            </Border.InputBindings>
            <DockPanel>
                <TextBlock Width="{Binding ActualWidth, ElementName=column_1}" Margin="6,0,0,0" Text="{Binding Column1}" />
                <TextBlock Margin="0,0,0,0" Text="{Binding Column2}" />
            </DockPanel>
        </Border>
    </ControlTemplate>

列表视图:

    <ListView x:Name="your_listview"
              ItemsSource="{Binding Some_Source_Collection}"
              SelectedIndex="{Binding Some_Int_Variable}">

        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="BorderBrush" Value="LightGray" />
                <Setter Property="BorderThickness" Value="0,0,0,1" />

                <Style.Triggers>

                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true" />
                            <Condition Property="Selector.IsSelectionActive" Value="true" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Foreground" Value="White" />
                        <Setter Property="Template" Value="{StaticResource Selected_Item_Template}" />
                    </MultiTrigger>

                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true" />
                            <Condition Property="Selector.IsSelectionActive" Value="false" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Foreground" Value="White" />
                        <Setter Property="Template" Value="{StaticResource Selected_Item_Template}" />
                    </MultiTrigger>

                </Style.Triggers>

            </Style>
        </ListView.ItemContainerStyle>

        <ListView.View>
            <GridView x:Name="your_listview_gridview">
                <GridViewColumn x:Name="column_1" Header="Name:" Width="100"
                                DisplayMemberBinding="{Binding Column1}">

                    <GridViewColumn.HeaderContainerStyle>

                        <Style TargetType="{x:Type GridViewColumnHeader}">
                            <Setter Property="HorizontalContentAlignment" Value="Left" />
                            <Setter Property="VerticalContentAlignment" Value="Center" />
                            <Setter Property="IsEnabled" Value="True"/>
                        </Style>

                    </GridViewColumn.HeaderContainerStyle>

                </GridViewColumn>

                <GridViewColumn x:Name="column_2" Header="Path:" Width="250"
                                DisplayMemberBinding="{Binding Column2}">

                    <GridViewColumn.HeaderContainerStyle>

                        <Style TargetType="{x:Type GridViewColumnHeader}">
                            <Setter Property="HorizontalContentAlignment" Value="Left" />
                            <Setter Property="VerticalContentAlignment" Value="Center" />
                            <Setter Property="IsEnabled" Value="True"/>
                        </Style>

                    </GridViewColumn.HeaderContainerStyle>

                </GridViewColumn>
            </GridView>
        </ListView.View>

    </ListView>

如果您对将 SelectedItems 转换成可用的东西有任何疑问或需要帮助,请联系我。