我正在编写一个文件夹浏览器,我想双击打开文件夹。 我的文件夹绑定到ListView,里面有GridView,我跟踪双击如下:
<i:EventTrigger EventName="MouseDoubleClick">
<Custom:EventToCommand Command="{Binding FolderOpenedCommand, Mode=OneWay}" CommandParameter="{Binding SelectedItem, ElementName=FolderView}"/>
</i:EventTrigger>
但是我有一个恼人的问题:如果我双击gridview splitter来自动调整列,它也会打开所选的文件夹,这是我不想要的。 所以,我现在有几个选项:将事件处理程序置于样式中并将其与代码一起使用或保留原样,但在我的情况下,我想用MVVM场景实现它,因为代码隐藏不适合我。
我的问题是:只有当我点击该项时我如何才能将我的参数作为SelectedItem发送,当我点击其他内容时我是如何发送?
我想跟踪这个以做出正确的行为,因为我无法在某些原因上双击到gridview。
有人可以帮我解决这个问题吗?
编辑: 让我们澄清一件事,以确保我们谈论相同的事情: 我可以定义类似这样的东西
<Style x:Key="itemStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource MetroListViewItem}">
<EventSetter Event="MouseDoubleClick" Handler="FolderView_OnMouseDoubleClick"></EventSetter>
</Style>
我不能这样做:
<Style x:Key="itemStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource MetroListViewItem}">
<EventSetter Event="MouseDoubleClick" Handler="{Binding OpenFilesCommand}"></EventSetter>
</Style>
因为它会导致异常。现在我想了解如果Handler不接受命令我怎么能在这里应用命令?我需要写一些附属物吗?
答案 0 :(得分:1)
避免使用listview。请改用DataGrid。然后,您可以将eventtrigger添加到行样式。 ListView是在wpf 3中引入的过时类,在wpf 4中被datagrid取代,没有理由再使用它了。
另一种选择是使用实现为附加属性的自定义行为,例如InvokeCommandOnRowDoubleClick附加到Grid。要了解有关附加行为的更多信息,请阅读以下内容:http://blogs.msdn.com/b/dgartner/archive/2009/11/11/wpf-attached-behavior-example-watermark-text.aspx
答案 1 :(得分:0)
MouseDoubleClick
控件上有ListViewItem
个属性。双击项目时,您可以重新设置样式以包含正确的事件,仅将其应用于ListViewItems,并且在不双击gridview分割器时不会侦听该事件。
您可以阅读有关此here的更多信息。
答案 2 :(得分:0)
好吧,为了解决这个问题,我必须为每个gridview列中的每个控件使用InputBindings属性。我把Grid放在控件之上,然后像这样:
<GridViewColumn Header="Size (Bytes)">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.FolderOpenedCommand}"
CommandParameter="{Binding ElementName=FolderView, Path=SelectedItem}"></MouseBinding>
</Grid.InputBindings>
<TextBlock Text="{Binding Path=Size, StringFormat='{}{0:#,#.}'}"/>
</Grid>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
不幸的是,对于我的情况,我没有找到更好的解决方案