У меня есть Pivot, в котором ListBox определен как его Pivot.ItemTemplate, как показано ниже.
<controls:Pivot x:Name="pivot">
<controls:Pivot.ItemTemplate>
<DataTemplate>
<ListBox x:Name="listBox">
...
</ListBox>
</DataTemplate>
</controls:Pivot.ItemTemplate>
</controls:Pivot>
как мне программно получить доступ к соответствующему элементу управления ListBox, соответствующему Pivot.SelectedItem или Pivot.SelectedIndex?
я пробовал что-то похожее на эту ссылку 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());
}
}
по какой-то причине я получаю System.Windows.Controls.Grid на Debug.WriteLine.
причина, по которой мне нужно получить дескриптор или получить доступ к ListBox внутри Pivot (который в данный момент отображается или выбран), заключается в том, что мне нужно сбросить его представление (прокрутить его вверх).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);
}
}