WPF Доступ к элементам внутри Listbox, который имеет UserControl как ItemTemplate - PullRequest
0 голосов
/ 29 мая 2010
  • У меня есть окно с ListBox
  • ListBox (MyListBox) имеет DataTable для своего DataContext
  • Источник элемента ListBox: {Binding}
  • В списке есть 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 элементов в списке. Но когда я использовал гораздо больше элементов, я увидел, что «var border» становится «нулевым» после того, как некоторые элементы зациклены в функции foreach.

Я нашел причину здесь: ListView.ItemContainerGenerator.ContainerFromItem (item) возвращает ноль после 20 элементов

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 мая 2010

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

  • Я понял, что нет необходимости использовать UserControl в качестве DataTemplate в моем проекте. Поэтому я удалил DataTemplate ListBox.
  • Я удалил MyListBox.DataContext = myDataTable и использовал это:

    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 
    }
    

Полегче, а? :)

0 голосов
/ 29 мая 2010

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

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

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

...