WPF访问Listbox中具有UserControl作为ItemTemplate的项目

时间:2010-05-29 13:42:55

标签: wpf listbox user-controls datatemplate

  • 我有一个有ListBox的Window
  • ListBox(MyListBox)为其DataContext
  • 提供了DataTable
  • ListBox的ItemSource是:{Binding}
  • Listbox有一个UserControl(MyUserControl)作为DataTemplate
  • UserControl有RadioButtons和TextBoxes(首先它们填充了DataTable中的值,然后用户可以更改它们)
  • 窗口有一个提交按钮

我想要做的是,当用户点击提交按钮时

  • 对于每个ListBox项,从UserControl的TextBoxes和RadioButtons获取值。

我正在使用这种方法完成这项工作:

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
}

在Listbox中使用3-5项时我什么都没认识。但是当我使用更多的项目时,我发现在一些元素在foreach函数中循环后,“var border”变为“null”。

我在这里找到了原因: ListView.ItemContainerGenerator.ContainerFromItem(item) return null after 20 items

那我现在该怎么办?我想访问所有项目并将其值设置为用户控件。

由于

2 个答案:

答案 0 :(得分:0)

您应该使用实施INotifyPropertyChanged的对象并将其ObservableCollection绑定到ItemSource 然后你就可以获得所有项目清单。

这里有一些来自MSDN的快速链接,以获取更多信息 How to: Implement Property Change Notification Binding Sources Overview

你应该谷歌一些关于此的教程。

答案 1 :(得分:0)

Zied的帖子是解决这个问题的方法。但我为我的项目做了以下事情:

  • 我意识到在我的项目中不需要将UserControl用作DataTemplate。所以我删除了ListBox的DataTemplate。
  • 我删除了MyListBox.DataContext = myDataTable并使用了这个:

    foreach(DataRow dr in myDataTable.Rows)
    {
     MyUserControl muc = new MyUserControl(dr);
     myListBox.Items.Add(muc);
    }
    
  • 我在UserControl的构造函数中使用了DataRow并完成了我想要的操作。
  • 最后我可以使用以下命令访问ListBox中的UserControls:
    foreach(MyUserControl muc in
    myListBox) 
    { 
    //do what you want 
    }
    

好吧? :)