none
切换到RTM版本出现的问题 RRS feed

答案

  • 我只是做了验证,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
    2012年8月29日 7:29
    版主

全部回复

  • 我只是做了验证,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
    2012年8月29日 7:29
    版主
  • 注意一下:第一个方案仅适用于你用了绑定在ListView的 ItemsSource上 

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月29日 8:36
    版主
  • 谢谢Bob,我用第一个方案解决了这个问题,好好研究下这方面知识点。
    2012年8月29日 8:37