2011-08-09 138 views
1

我有一个Pivot,它有一个ListBox定义为它的Pivot.ItemTemplate,如下所示。如何访问Windows Phone 7中的枢轴内的列表框?

<controls:Pivot x:Name="pivot"> 
<controls:Pivot.ItemTemplate> 
    <DataTemplate> 
    <ListBox x:Name="listBox"> 
    ... 
    </ListBox> 
    </DataTemplate> 
</controls:Pivot.ItemTemplate> 
</controls:Pivot> 

如何以编程方式访问对应于Pivot.SelectedItem或Pivot.SelectedIndex的相应ListBox控件?

我试过类似于这个链接http://www.windowsphonegeek.com/tips/how-to-access-a-control-placed-inside-listbox-itemtemplate-in-wp7

var count = VisualTreeHelper.GetChildrenCount(pivotItem); 
for(int i=0; i < count; i++) { 
var child = VisualTreeHelper.GetChild(pivotItem, i); 
if(child is ListBox) { 
    //do something 
} else { 
    Debug.WriteLine(child.GetType()); 
} 
} 

由于某种原因,我得到Debug.WriteLine上的System.Windows.Controls.Grid。

为什么我需要获取句柄或访问Pivot(当前正在显示/选中)内部的ListBox的原因是因为我需要重置其视图(将其滚动回顶端)。 ListBox是绑定到ObservableCollection的数据,当我更新集合时,滚动位置需要放回顶部;否则,一切工作(数据绑定/视觉显示),除了现在视图停留在中间或用户当前位置。如果有一个更简单的方法来做到这一点,而不需要处理ListBox,我也可以使用该解决方案。

为了防止任何人感兴趣,我修补了一些东西,专门为我的情况。代码如下。基本上,我必须先获得PivotItem。

PivotItem pivotItem = pivot.ItemContainerGenerator.ContainerFromItem(myObject) as PivotItem; 

然后,我创建了一个局部变量来存储ListBox(如果找到)并递归树视图模型。

ListBox listBox = null; 
Recurse(pivotItem, ref listBox); 

和我的Recurse函数如下所示。

private void Recurse(DependencyObject obj, ref ListBox listBox) { 
if(obj is ListBox) { 
    listBox = obj as ListBox; 
    return; 
} 

var count = VisualTreeHelper.GetChildrenCount(obj); 
for(int i=0; i < count; i++) { 
    var child = VisualTreeHelper.GetChild(obj, i); 
    Recurse(child, ref listBox); 
} 
} 

回答

2

尝试:

(Listbox)VisualTreeHelper.GetChild((pivot.SelectedItem as PivotItem), 0); 
+0

当我尝试你所说的,我得到一个InvalidOperationException:引用不是一个有效的视觉DependencyObject。 – jake

0

看起来这是一个而回,但是这是对我工作:

首先得到PivotItem:

PivotItem pivotItem = Pivot.ItemContainerGenerator.ContainerFromItem(Pivot.SelectedItem) as PivotItem; 

然后从PivotI获得第一个孩子,一个ListBox TEM:

 private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject { 
     var count = VisualTreeHelper.GetChildrenCount(parentElement); 
     if (count == 0) 
      return null; 

     for (int i = 0; i < count; i++) { 
      var child = VisualTreeHelper.GetChild(parentElement, i); 

      if (child != null && child is T) { 
       return (T)child; 
      } else { 
       var result = FindFirstElementInVisualTree<T>(child); 
       if (result != null) 
        return result; 

      } 
     } 
     return null; 
    } 

然后调用:

ListBox listBox = FindFirstElementInVisualTree<ListBox>(pivotItem);