在我的WPF - MVVM应用程序中,我有一个ListView,其中有一个GridView。 在双击GridView中的一行时,我想读取该行中一列中的文本。
我想使用命令来维护MVVM模式。
我知道可以使用InputBindings为DoubleClick事件连接命令。但GridView没有InputBinding。
任何想法如何实现功能??
由于
注意 - 想知道上述是否可以通过纯粹使用命令来实现 - 没有代码隐藏的DoubleClick事件处理?
答案 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
投射到可用的内容中,请告诉我。