- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个列表框,直到最近它还显示一个平面项目列表。我能够使用 myList.ItemContainerGenerator.ConainerFromItem(thing) 检索列表中托管“thing”的 ListBoxItem。
本周我稍微修改了 ListBox,因为它为其项目绑定(bind)的 CollectionViewSource 已启用分组。现在,列表框中的项目被分组在漂亮的标题下。
但是,自从执行此操作后,ItemContainerGenerator.ContainerFromItem 已停止工作 - 即使对于我知道在 ListBox 中的项目,它也会返回 null。哎呀 - 即使 ListBox 填充了许多项目,ContainerFromIndex(0) 也会返回 null!
如何从显示分组项的 ListBox 中检索 ListBoxItem?
编辑:这是精简示例的 XAML 和代码隐藏。这会引发 NullReferenceException,因为即使列表中有四个项目,ContainerFromIndex(1) 也会返回 null。
XAML:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
Title="Window1">
<Window.Resources>
<XmlDataProvider x:Key="myTasks" XPath="Tasks/Task">
<x:XData>
<Tasks xmlns="">
<Task Name="Groceries" Type="Home"/>
<Task Name="Cleaning" Type="Home"/>
<Task Name="Coding" Type="Work"/>
<Task Name="Meetings" Type="Work"/>
</Tasks>
</x:XData>
</XmlDataProvider>
<CollectionViewSource x:Key="mySortedTasks" Source="{StaticResource myTasks}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="@Type" />
<scm:SortDescription PropertyName="@Name" />
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="@Type" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<ListBox
x:Name="listBox1"
ItemsSource="{Binding Source={StaticResource mySortedTasks}}"
DisplayMemberPath="@Name"
>
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
</Window>
CS:
public Window1()
{
InitializeComponent();
listBox1.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
}
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
if (listBox1.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
listBox1.ItemContainerGenerator.StatusChanged -= ItemContainerGenerator_StatusChanged;
var i = listBox1.ItemContainerGenerator.ContainerFromIndex(1) as ListBoxItem;
// select and keyboard-focus the second item
i.IsSelected = true;
i.Focus();
}
}
最佳答案
您必须监听 ItemsGenerator.StatusChanged
事件并使用react,并等到 ItemContainer 生成后才能使用 ContainerFromElement 访问它们。
进一步搜索,我发现 a thread in the MSDN forum来自有同样问题的人。当设置了 GroupStyle 时,这似乎是 WPF 中的一个错误。解决方案是在渲染过程之后取消对 ItemGenerator 的访问。以下是您的问题的代码。我尝试过这个,它有效:
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
if (listBox1.ItemContainerGenerator.Status
== System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
listBox1.ItemContainerGenerator.StatusChanged
-= ItemContainerGenerator_StatusChanged;
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input,
new Action(DelayedAction));
}
}
void DelayedAction()
{
var i = listBox1.ItemContainerGenerator.ContainerFromIndex(1) as ListBoxItem;
// select and keyboard-focus the second item
i.IsSelected = true;
i.Focus();
}
关于.net - ItemContainerGenerator.ContainerFromItem 如何使用分组列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/165424/
我有一个列表框,直到最近它还显示一个平面项目列表。我能够使用 myList.ItemContainerGenerator.ConainerFromItem(thing) 检索列表中托管“thing”的
我有一些奇怪的行为,我似乎无法解决。当我遍历 ListBox.ItemsSource 属性中的项目时,我似乎无法获取容器?我期待看到 ListBoxItem 返回,但我只得到 null。 有任何想法吗
我看过here和 here和许多其他地方,但我似乎无法让 ItemContainerGenerator.ContainerFromItem 方法在 WPF TreeView 上工作!我试图传递我想看到
我看过here和 here和许多其他地方,但我似乎无法让 ItemContainerGenerator.ContainerFromItem 方法在 WPF TreeView 上工作!我试图传递我想看到
我的页面上有一个 TreeView。它绑定(bind)到包含契约(Contract)的客户集合,例如: public class Client { public int ClientID { ge
我已经阅读了一些关于这个主题的主题,但找不到任何内容来做我想做的事情。我有一个绑定(bind)到一组分层对象的 TreeView 。这些对象中的每一个都代表 map 上的一个图标。当用户单击 map
我有一个 TreeView 如下: 在后面的代码中,我
我创建了一个具有一个根元素的 TreeView: TreeViewControl treeViewConrol = new TreeViewControl(tvVisual,TreeServiceMa
我一直在使用以下代码在 Dispatcher 中绑定(bind) wpf ListBox Dispatcher.BeginInvoke(new Action(() =>
我有一个可变尺寸的 DataGrid 取决于屏幕分辨率。我需要知道有多少行对用户可见。这是我的代码: uint VisibleRows = 0; var TicketGrid = (DataGrid)
在下面的示例中,当我选择“String”时,窗口的标题变为“null”。但我必须获得“String”的容器。具体来说,我想执行与 SelectedItem = null 相同的操作(但该属性只对 Tr
这是我在这里的第一篇文章,所以我希望你能帮助我解决关于 WPF 的问题。 我有一个与 ObservableCollection 绑定(bind)的列表框: public ObservableC
我在使用 this question 时遇到了类似的问题但是 VirtualizingStackPanel.IsVirtualizing="False" 没有解决我的问题。有没有人面临同样的问题? 问
我有一个没有项目模板的简单 ListView 和 SelectionChanged 事件设置: private void list1_SelectionChanged(object
我是一名优秀的程序员,十分优秀!