我有一个带有 Foo 对象的 ListBox,并且根据一些事件我禁用/启用 ListBox 中的 ListBoxItems。使用 ListBox.Items 属性,我找到 Foo 对象,根据我的理解,我需要使用以下函数来获取 Foo 的 ListBoxItem 容器。正确的?
foreach (var item in Items)
{
var lbi = ItemContainerGenerator.ContainerFromItem(foo) as ListBoxItem;
// do something
}
实际上我有一个自定义控件 FilteringListBox 它继承 ListBox 并向其添加一个额外的属性。上面的代码位于自定义控件的代码后面,并且在创建 FilteringListBox 后工作得很好。然而,我的问题是,当某些属性被绑定时,我尝试这样做。我有一个属性 FilteringCollection 和一个在绑定时触发的 PropertyCallback 。在此回调中,我将存储 FilteringCollection,但我还将执行初始过滤 - 运行集合集合并禁用任何表示 FilteringCollection 中的 Foo 的 ListBoxItem。
这就是我遇到问题的地方。我找到了所有 Foos,因此我验证了 ItemsSource 是否已设置,但执行 ItemContainerGenerator.ContainerFromItem 我得到 null。就像 ListBoxItems 尚未创建一样。不是吗?这是我的绑定:
<custom:FilteringListBox ItemsSource="{Binding AvailableFoos}" FilteringCollection="{Binding AlreadyIncludedFoos}"></custom:FilteringListBox>
所以;或者:如何在“绑定时间”获取 ListBoxItems?或者——如果我不能;是否有一些我可以重写的事件告诉我 ListBox 已完成创建 ListBoxItems?尝试了初始化但没有运气......
实际上,更好的解决方案似乎是使用项目容器生成器。在创建时连接事件处理程序:
ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
并使事件处理程序执行需要执行的操作:
protected void ItemContainerGenerator_StatusChanged(object sender, System.EventArgs e)
{
if (ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
EvaluateInitialElements();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)