2010-09-09 57 views
2

我有一个ListBox与Foo对象,并基于一些事件我禁用/启用列表框中的ListBoxItems。使用ListBox.Items属性,我发现Foo对象,并从我了解我需要使用以下函数获取Foo的ListBoxItem容器。正确?如何在“绑定时间”获取ListBox中的项目ListBoxItem

其实我有继承ListBox和增加了一个额外的属性给它一个自定义的控制FilteringListBox。上面的代码位于自定义控件的后面代码中,并且在FilteringListBox完成创建时工作得很好。然而,我的问题是,当某些财产受到约束时,我会尝试这样做。当绑定时,我有一个属性FilteringCollection和一个PropertyCallback。在这个回调函数中,我将存储FilteringCollection,但是我还将执行初始过滤 - 运行set集合并禁用表示FilteringCollection中的Foo的任何ListBoxItem。

这是我遇到问题的地方。我找到了所有的Foos,所以我确认了ItemsSource被设置了,但是做了ItemContainerGenerator.ContainerFromItem我得到了null。这就像ListBoxItems尚未创建。他们不是吗?这里是我的绑定:

<custom:FilteringListBox ItemsSource="{Binding AvailableFoos}" FilteringCollection="{Binding AlreadyIncludedFoos}"></custom:FilteringListBox> 

所以;要么:我怎样才能获得“绑定时间”的ListBoxItems?或者 - 如果我不能;是否有一些事件我可以重写,告诉我ListBox完成创建ListBoxItems?试图OnInitialized没有运气...

回答

1

实际上更好的解决方案似乎是使用ItemContainerGenerator。挂钩事件处理程序上创建:

ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged; 

,使事件处理程序做需要做的事情:

protected void ItemContainerGenerator_StatusChanged(object sender, System.EventArgs e) 
{ 
    if (ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) 
     EvaluateInitialElements(); 
} 
0

事件OnRender被触发时,该组件是准备渲染,因此在创建ListBoxItem中的。在此事件上进行过滤的初始处理似乎确保了我所需的一切都准备就绪。我评估和禁用元素,然后触发渲染:

protected override void OnRender(System.Windows.Media.DrawingContext drawingContext) 
{ 
    EvaluateInitialElements(); 
    base.OnRender(drawingContext); 
} 
相关问题