WPF Доступ к элементам внутри Listbox, который имеет UserControl как ItemTemplate

  • У меня есть окно со списком ListBox
  • ListBox (MyListBox) имеет DataTable для своего DataContext
  • ItemSource ListBox: {Binding}
  • Listbox имеет UserControl (MyUserControl) как DataTemplate
  • UserControl имеет RadioButtons и TextBoxes (сначала они заполняются значениями из DataTable, а затем пользователь может их изменить)
  • В окне есть одна кнопка "Отправить"

Я хочу сделать, когда пользователь нажимает кнопку отправки

  • Для каждого элемента ListBox получите значения из TextBoxes и RadioButton UserControl.

Я использовал этот метод для этой работы:

foreach(var element in MyListBox.Items)
{ 
  var border = MyListBox.ItemContainerGenerator.ContainerFromItem(element)as FrameworkElement;
  MyUserControl currentControl = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(myBorder,0) as Border,0)as ContentPresenter,0)as MyUserControl;
  //And use currentControl
}

Я ничего не понял, когда использовал 3-5 элементов в Listbox. Но когда я использовал гораздо больше элементов, я увидел, что «var border» получает «null» после того, как некоторые элементы зацикливаются в функции foreach.

Я нашел здесь причину: ListView.ItemContainerGenerator.ContainerFromItem (item) return null после 20 позиций

Так что же мне теперь делать? Я хочу получить доступ ко всем элементам и получить их значения в пользовательских элементах управления.

Спасибо


person Turker    schedule 29.05.2010    source источник


Ответы (2)


Вы должны использовать объекты, которые реализуют INotifyPropertyChanged и привязать ObservableCollection его к ItemSource. И тогда вы можете получить весь список элементов.

Вот несколько быстрых ссылок из MSDN для получения дополнительной информации. Как: реализовать уведомление об изменении свойства Обзор источников привязки

Вам следует найти в Google несколько руководств по этому поводу.

person Zied    schedule 29.05.2010

Пост Зиеда - решение этой проблемы. Но для своего проекта я сделал следующее:

  • Я понял, что в моем проекте нет необходимости использовать UserControl как DataTemplate. Поэтому я удалил DataTemplate ListBox.
  • # P2 #
    foreach(DataRow dr in myDataTable.Rows)
    {
     MyUserControl muc = new MyUserControl(dr);
     myListBox.Items.Add(muc);
    }
    
  • Я взял DataRow в свой конструктор UserControl и сделал то, что хотел.
  • И, наконец, я смог получить доступ к своим UserControls в ListBox, используя:
    foreach(MyUserControl muc in
    myListBox) 
    { 
    //do what you want 
    }
    

Легко, да? :)

person Turker    schedule 31.05.2010