【问题标题】:Command for DoubleClick on ListView's GridView Row双击 ListView GridView 行的命令
【发布时间】:2015-01-30 09:33:35
【问题描述】:

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

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

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

知道如何实现该功能吗?

谢谢


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

【问题讨论】:

  • 如果您包含一些您编写的 XAML 代码会有所帮助。
  • 难道你也想达到和here一样的效果?
  • @Claudio - 您提到的链接指定使用事件 - 但这将使用代码隐藏。在 MVVM 中,这不会被广泛接受。我想知道是否可以使用纯命令实现所需的功能?
  • 借助交互触发器,您可以简单地将事件绑定到视图模型中的命令
  • zamjad.wordpress.com/2014/11/19/… 这里是一个例子

标签: c# wpf mvvm


【解决方案1】:

我为我的 GridView 中的一列使用了 CellTemplate,在该单元格模板中我提供了 InputBindings - MouseBinding for Double Click 事件。这会将双击事件变成一个命令,然后我将单元格的文本作为命令参数发送。

<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 暴露在我的视图模型上。

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

【讨论】:

  • 谢谢我让它工作。并且是我需要的一个很好的方向。但是,除非我为每列复制相同的代码,否则我无法让它在多个列上工作。
  • 这个问题也让我抓狂,这个解决方案的唯一缺点是我必须为每个 GridViewColumn 设置 InputBindings
【解决方案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>

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

【讨论】:

    【解决方案3】:

    我试图找到一个好的解决方案并尝试了这个,但遗憾的是它没有奏效。对于在同一条船上并碰巧发现自己在这里的任何人,我发现了两种非常可靠的方法。有很多其他方法可以解决这个问题,但是我想避免使用任何额外的 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:

        <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 转换成可用的东西有任何疑问或需要帮助,请私信我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 2010-10-24
      • 1970-01-01
      • 2011-03-23
      • 2020-10-23
      相关资源
      最近更新 更多