双击 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
创建了一个 ControlTemplate
。 ControlTemplate
需要调整为既包含您想要的任何高亮颜色效果,也必须包含您选择的任何行的数据。关于这一点的重要部分是即使有多个列也能很好地工作。每个 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
转换成可用的东西有任何疑问或需要帮助,请联系我。
在我的 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
创建了一个 ControlTemplate
。 ControlTemplate
需要调整为既包含您想要的任何高亮颜色效果,也必须包含您选择的任何行的数据。关于这一点的重要部分是即使有多个列也能很好地工作。每个 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
转换成可用的东西有任何疑问或需要帮助,请联系我。