【问题标题】:WPF Accessing Items inside Listbox which has a UserControl as ItemTemplateWPF访问列表框中的项目,其中有一个UserControl作为ItemTemplate
【发布时间】:2010-05-29 13:42:54
【问题描述】:
  • 我有一个有列表框的窗口
  • 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 边框”变为“空”。

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

那我现在能做什么?我想访问所有项目并在用户控件上获取它们的值。

谢谢

【问题讨论】:

    标签: wpf listbox user-controls datatemplate


    【解决方案1】:

    您应该使用实现INotifyPropertyChanged 的对象并将其ObservableCollection 绑定到ItemSource 然后你就可以得到所有的项目列表了。

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

    你应该在谷歌上搜索一些关于这个的教程。

    【讨论】:

      【解决方案2】:

      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 中的用户控件:
        foreach(MyUserControl muc in
        myListBox) 
        { 
        //do what you want 
        }
        

      简单吧? :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        相关资源
        最近更新 更多