如何访问Windows Phone 7中的Pivot内的ListBox?

时间:2011-08-09 16:38:08

标签: windows-phone-7

我有一个Pivot,它将ListBox定义为Pivot.ItemTemplate,如下所示。

<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);
 }
}

3 个答案:

答案 0 :(得分:2)

尝试:

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

答案 1 :(得分:0)

看起来这是一段时间了,但这对我有用:

首先获取PivotItem:

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

然后从数据透视表中获取第一个子项ListBox:

        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);

答案 2 :(得分:0)

在ListBox中使用StackPanel                                                                                                                                                                              这个链接可能对你有帮助 http://blogs.msdn.com/b/oren/archive/2010/11/08/wp7-silverlight-perf-demo-1-virtualizingstackpanel-vs-stackpanel-as-a-listbox-itemspanel.aspx