我有一个绑定到ItemsSource的ListBox,如下所示:
var foos = new ObservableCollection<Foo> { foo1, foo2, foo3 };
var listBox = new ListBox { ItemsSource = _foos };现在,我想立即在保存这些项的ListBoxItems上执行一些操作,但它们似乎不是立即创建的。是吗?有没有什么事件我可以通过监听来得到通知,或者我只是试图以一种无效的方式获取ListBoxItem?我是这样做的(并且我已经验证了它在我知道ListBox已经“准备好”的地方工作正常):
var lbi = listBox.ItemContainerGenerator.ContainerFromItem(foo1) as ListBoxItem;请注意,这是在单元测试中完成的,所以我猜ListBox永远不会被呈现。这就是不创建ListBoxItems的原因吗?我能以某种方式手动触发ListBoxItems的创建吗?
发布于 2010-09-10 16:14:32
Items-创建是异步完成的,根据面板的不同,可能根本没有创建(virtualization)。您要查找的事件是ItemContainerGenerator.StatusChanged。在SO上用谷歌搜索一下,你会发现很多例子。然而,直接搜索和处理项目可能会变得复杂。
Here是一篇非常好的文章,详细讨论了项目的创建。另请查找ancestor-article。
顺便说一下:我建议你看看MVVM-pattern。虽然有一点时间你可以轻松地学习它(不能与学习WPF的时间相比),但它会为你节省很多时间。Here你可以找到一个来自Jason Dolinger的视频的链接,它给了你一个很好的起点。
更新:
正如评论中所承诺的,这里有一个搜索可视化树的函数(仅在虚拟化关闭时可用)。
void FindChildFrameworkElementsOfType<T>(DependencyObject parent,IList<T> list) where T: FrameworkElement{
DependencyObject child;
for(int i=0;i< VisualTreeHelper.GetChildrenCount(parent);i++){
child = VisualTreeHelper.GetChild(parent, i);
if (child is T) {
list.Add((T)child);
}
FindChildFrameworkElementsOfType<T>(child,list);
}
} https://stackoverflow.com/questions/3683069
复制相似问题