积极答复者
切换到RTM版本出现的问题

问题
-
之前曾经询问过在ListViewItem上放置一个Button,在Button的Click事件中要获取当前ListView焦点进行处理。所以记录了一个标记,然后再ListView的ItemClick事件中再处理。
后来更新到RTM版本,发现Button的Click事件触发之后,ListView的ItemClick事件不会再触发,导致功能无法实现了。
答案
-
我只是做了验证,RTM确实是这样的。
不过我的疑惑是你之前的处理方式其实并不好,你完全应该用过Button的DataContext 去获得所绑定的Data ,然后通过 ListView.ItemContainerGenerator 去获得相关的ListViewItem 以及 Index:
ListView lst = new ListView(); ListViewItem lsti = lst.ItemContainerGenerator.ContainerFromItem(btn.DataContext) as ListViewItem; lst.ItemContainerGenerator.IndexFromContainer(lsti);
或者你也应该通过可视树查找父元素来找到Button的父元素ListViewItem,然后ItemContainerGenerator.IndexFromContainer 来获得Index:
private void Button_Click_1(object sender, RoutedEventArgs e) { ListViewItem lsti = FindVisualParent<ListViewItem>(sender as Button); } public T FindVisualParent<T>(DependencyObject child) where T : DependencyObject { DependencyObject parentObject = VisualTreeHelper.GetParent(child); if (parentObject == null) return null; T parent = parentObject as T; if (parent != null) return parent; else return FindVisualParent<T>(parentObject); }
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 lslemoon 2012年8月29日 8:37
全部回复
-
我只是做了验证,RTM确实是这样的。
不过我的疑惑是你之前的处理方式其实并不好,你完全应该用过Button的DataContext 去获得所绑定的Data ,然后通过 ListView.ItemContainerGenerator 去获得相关的ListViewItem 以及 Index:
ListView lst = new ListView(); ListViewItem lsti = lst.ItemContainerGenerator.ContainerFromItem(btn.DataContext) as ListViewItem; lst.ItemContainerGenerator.IndexFromContainer(lsti);
或者你也应该通过可视树查找父元素来找到Button的父元素ListViewItem,然后ItemContainerGenerator.IndexFromContainer 来获得Index:
private void Button_Click_1(object sender, RoutedEventArgs e) { ListViewItem lsti = FindVisualParent<ListViewItem>(sender as Button); } public T FindVisualParent<T>(DependencyObject child) where T : DependencyObject { DependencyObject parentObject = VisualTreeHelper.GetParent(child); if (parentObject == null) return null; T parent = parentObject as T; if (parent != null) return parent; else return FindVisualParent<T>(parentObject); }
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 lslemoon 2012年8月29日 8:37
-
注意一下:第一个方案仅适用于你用了绑定在ListView的 ItemsSource上
Bob Bao [MSFT]
MSDN Community Support | Feedback to us