WPF ListView 选中问题

 摘自:http://www.cnblogs.com/BBHor/archive/2013/04/28/VisualTreeHelper-PreviewMouseDown.html

在项目中遇到了这样的问题,ListView通过数据绑定,有模板的情况下ListViewItem 里面的子控件点击之后默认是子控件获得焦点而不是Item获的焦点。

往往需要获取一个ListViewItem  而不是他的子控件,这时候应该怎么办呢?

先看前台XAML:

 1  <ListView x:Name="lv_VMlist"
2 PreviewMouseDown="lv_VMlist_PreviewMouseDown"
3 SelectionChanged="lv_VMlist_SelectionChanged">
4 <ListView.View>
5 <GridView>
6 <GridView.Columns>
7 <GridViewColumn Width="100"
8 DisplayMemberBinding="{Binding CallerID}"
9 Header="主叫方号码" />
10 <GridViewColumn Width="110"
11 DisplayMemberBinding="{Binding Duration}"
12 Header="语音邮件长度" />
13 <GridViewColumn Width="70"
14 DisplayMemberBinding="{Binding External}"
15 Header="是否是外线" />
16 <GridViewColumn Width="80"
17 DisplayMemberBinding="{Binding Type,
18 Converter={StaticResource etsc}}"
19 Header="类型" />
20 <GridViewColumn Width="70"
21 DisplayMemberBinding="{Binding AttachCount}"
22 Header="附件个数" />
23 <GridViewColumn Width="120"
24 DisplayMemberBinding="{Binding Time}"
25 Header="时间" />
26 <GridViewColumn Width="180" Header="操作">
27 <GridViewColumn.CellTemplate>
28 <HierarchicalDataTemplate>
29 <StackPanel Name="stackPanel" Orientation="Horizontal">
30 <Button Name="btnPlay"
31 Margin="0,0,5,0"
32 Command="{Binding RelativeSource={RelativeSource FindAncestor,
33 AncestorLevel=1,
34 AncestorType={x:Type ListView}},
35 Path=DataContext.OnPlay}"
36 Content="播放"
37 Focusable="False" />
38 <Button Name="btnStop"
39 Margin="0,0,5,0"
40 Command="{Binding RelativeSource={RelativeSource FindAncestor,
41 AncestorLevel=1,
42 AncestorType={x:Type ListView}},
43 Path=DataContext.OnStop}"
44 Content="停止" />
45 <Button Name="btnSaveAs"
46 Margin="0,0,5,0"
47 Click="btnSaveClick"
48 Content="另存为"
49 ToolTip="将语音邮件保存到本地" />
50 <Button Name="btnDel"
51 Margin="0,0,5,0"
52 Command="{Binding RelativeSource={RelativeSource FindAncestor,
53 AncestorLevel=1,
54 AncestorType={x:Type ListView}},
55 Path=DataContext.OnDelete}"
56 Content="删除"
57 ToolTip="删除本条语音邮件" />
58 <Button Name="btnSendTo"
59 Margin="0,0,5,0"
60 Content="转发"
61 ToolTip="将本条语音邮件转发给他人" />
62 </StackPanel>
63 </HierarchicalDataTemplate>
64 </GridViewColumn.CellTemplate>
65 </GridViewColumn>
66 </GridView.Columns>
67 </GridView>
68 </ListView.View>
69 </ListView>

要下手去寻找这时候得借助WPF里面的一个神奇的类:VisualTreeHelper  有了这个类几乎能得到界面的任何东西。当然了,先行条件是在子控件的事件触发之前就要出发一个事件去获取ListViewItem,此时我们想到一个事件就是PreviewMouseDown,因为他是鼠标事件,所以优先级比较高,当他触发了之后才会触发子控件的一些Click事件等

 1   private void lv_VMlist_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
2 {
3 int index = -1;
4 DependencyObject depObj = e.OriginalSource as DependencyObject;
5
6 if (depObj == null) return;
7
8 do
9 {
10 depObj = VisualTreeHelper.GetParent(depObj);
11
12 //有可能是点击到listviewitem之外的东西,例如滚动条,这时候会为null
13 if (depObj == null) break;
14
15 //得到listviewitem
16 if (depObj.GetType() == typeof(ListViewItem))
17 {
18 //再去获取父级,用来得到索引
19 DependencyObject parent = VisualTreeHelper.GetParent(depObj);
20
21 for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
22 {
23 if (depObj == VisualTreeHelper.GetChild(parent, i))
24 {
25 //得到索引后马上跳出
26 index = i;
27 break;
28 }
29 }
30 break;
31 }
32 }
33 while (depObj != null);
34
35 //证明已经找到
36 if (index > -1)
37 {
38 lv_VMlist.SelectedIndex = index;
39 }
40 }

但是需要注意的是,这样写思路倒是简单,就是数据量大的清空可能会影响效率,慎用!

WPF ListView 选中问题的更多相关文章

  1. listview选中没有效果

    listview选中没有效果了,设置了android:listselector也没有效果,最后发现是listview中的item布局设置了背景颜色导致,把item的背景色去掉就OK了 http://b ...

  2. [WPF]ListView点击列头排序功能实现

    [转]   [WPF]ListView点击列头排序功能实现 这是一个非常常见的功能,要求也很简单,在Column Header上显示一个小三角表示表示现在是在哪个Header上的正序还是倒序就可以了. ...

  3. wpf listbox 选中项 上移下移

    原文:wpf listbox 选中项 上移下移 private void MoveUp_Click(object sender, RoutedEventArgs e)         {        ...

  4. WPF ListView 居中显示

    原文:WPF ListView 居中显示 今天遇到的问题: 方法1:设置GridViewColumn的ActualWidth <ListView > <ListView.View&g ...

  5. WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画

    原文:WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画 利用WPF的ListView控件实现类似于Winform中DataGrid行背景色交替变换的效果,同 ...

  6. WPF listview item mouse enter/over popup

    This is because the routing strategy of the Loaded event is Direct, which means that the routed even ...

  7. wpf ListView DataTemplate方式的鼠标悬停和选中更改背景色

    今天使用wpf技术弄一个ListView的时候,由于需求需要,需要ListView显示不同的数据模板,很自然的使用了DataTemplate方式来定义多个数据模板,并在ListView中使用ItemT ...

  8. WPF ListView点击删除某一行并获取绑定数据

    最近在开发WPF程序时遇到一个问题,在gridview中希望实现在每一行最后添加一个删除的按钮,但是发现点击每行的button时只会触发button的点击事件,并没有选中这一行,此时调用list.Se ...

  9. WPF ListView DoubleClick

    <ListView   x:Name="TrackListView"  MouseDoubleClick="MouseDoubleClick"       ...

随机推荐

  1. 手机操控全站仪安卓版 测量员.app

    大家期待已久的智能化全站仪测量功能已经实现了, 简介 测量员是一款运行在智能手机上的测量应用程序,具有计算精确.轻松高效.智能便捷的特点.测量员可以应用在道路.桥梁.铁路.隧道.地铁.市政等工程中,除 ...

  2. [转]Android 超高仿微信图片选择器 图片该这么加载

    快速加载本地图片缩略图的方法: 原文地址:Android 超高仿微信图片选择器 图片该这么加载 其示例代码下载: 仿微信图片选择器 ImageLoader

  3. OAuth2.0和SSO授权

    一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该访问令牌访问资源服务器的资源.由于 ...

  4. 使用jQuery页面加载函数启动定时任务

    var timer; $(document).ready(function(){ if (timer == undefined) timer = window.setInterval(showTime ...

  5. Navi.Soft30.开放平台.聚合.开发手册

    1系统简介 1.1功能简述 现在是一个信息时代,并且正在高速发展.以前获取信息的途径非常少,可能只有电视台,收音机等有限的来源,而现在的途径数不胜数,如:QQ,微信,官方网站,个人网站等等 本开发手册 ...

  6. 让MyEclipse2013兼容Retina屏幕

    1. 找到文件:/Applications/MyEclipse/MyEclipse Professional.app/Contents/Profile/myeclipse.app/Contents/I ...

  7. android EditText inputType说明

    在开发的过程中,通常会用到EditText,如何让虚拟键盘来适应输入框中内容的类型,通常我们都会在xml文件中加入android:inputType="". android:inp ...

  8. 写给已有编程经验的 Python 初学者的总结

    当我开始学习Python的时候,有些事我希望我一早就知道.我花费了很多时间才学会这些东西.我想要把这些重点都编纂到一篇文章当中.这篇文章的目标读者,是刚刚开始学习Python语言的有经验的程序员,想要 ...

  9. SLAM拾萃(3):siftGPU

    前言 本周博客我们给大家介绍一下SiftGPU.由于特征匹配是SLAM中非常耗时间的一步,许多人都想把它的时间降至最短,因此目前ORB成了非常受欢迎的特征.而老牌SIFT,则一直给人一种“很严谨很精确 ...

  10. linux rdate

    检查服务器时间,发现服务器时间与当前时间错了很多.于是调整. 使用ntpdate ,不管如何设置,包括关闭防火期,设置ntp.conf,结果都不成功. 随即使用网上提供的另外一种方法,临时先解决一下燃 ...