跟踪我在ListView MVVM中单击的位置

时间:2015-05-12 12:47:41

标签: wpf xaml mvvm

我正在编写一个文件夹浏览器,我想双击打开文件夹。 我的文件夹绑定到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不接受命令我怎么能在这里应用命令?我需要写一些附属物吗?

3 个答案:

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

不幸的是,对于我的情况,我没有找到更好的解决方案