Как получить доступ к ListBox внутри Pivot в Windows Phone 7? - PullRequest
1 голос
/ 09 августа 2011

У меня есть 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);
 }
}

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

попробуй:

(Listbox)VisualTreeHelper.GetChild((pivot.SelectedItem as PivotItem), 0); 
0 голосов
/ 03 августа 2012

используйте StackPanel внутри вашего ListBox эта ссылка может вам помочь http://blogs.msdn.com/b/oren/archive/2010/11/08/wp7-silverlight-perf-demo-1-virtualizingstackpanel-vs-stackpanel-as-a-listbox-itemspanel.aspx

0 голосов
/ 14 февраля 2012

Похоже, это было некоторое время назад, но вот что у меня сработало:

Сначала получите PivotItem:

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

Затем получитепервый дочерний элемент, ListBox, из PivotItem:

        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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...