双击命令单击ListView的GridView行

时间:2015-01-30 09:33:35

标签: c# wpf mvvm

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

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

我知道可以使用InputBindings为DoubleClick事件连接命令。但GridView没有InputBinding。

任何想法如何实现功能??

由于


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

3 个答案:

答案 0 :(得分:4)

我在GridView中使用CellTemplate作为列,在该celltemplate中我提供了InputBindings - MouseBinding for Double Click事件。这会将双击事件转变为命令&然后我发送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>

这里,usercontrol的datacontext设置为viewmodel,ShowFileCommand在我的viewmodel上公开。

因此,在第二列中双击单元格时,会将命令与单元格中的文本一起作为命令参数

引发

答案 1 :(得分: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>

创建网格视图并使列继承此datatemplate

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

当然,您可以在模板中放置您想要的内容。我只是展示如何双击网格视图列行

答案 2 :(得分:1)

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

附加行为

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

纯XAML

我个人尽量在XAML中尽我所能。基本上我为ControlTemplate创建ListViewItem。需要调整ControlTemplate以包含您想要的任何高亮颜色效果,并且还必须包含您选择的任何行的数据。关于这个的重要部分即使有多个列也能很好地工作。对于每个ControlTemplate,您还需要单独的Command

这是一个带有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:

    <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投射到可用的内容中,请告诉我。