我有一个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控件?
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);
}
}
当我尝试你所说的,我得到一个InvalidOperationException:引用不是一个有效的视觉DependencyObject。 – jake