1

我有一个绑定到 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 的创建吗?

4

1 回答 1

3

项目创建是异步完成的,根据面板的不同,它可能根本没有创建(虚拟化)。您要查找的事件是ItemContainerGenerator.StatusChanged在SO上进行谷歌搜索,你会发现很多例子。然而,直接搜索和使用项目可能会变得复杂。

是一篇非常好的文章,详细讨论了项目创建。还要寻找祖先-article 。

顺便说一句:我建议您查看 MVVM 模式。虽然学习它的时间很少(无法与学习 WPF 的时间相比),但它会为您节省大量时间。在这里,您可以找到 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); 
    } 
} 
于 2010-09-10T08:14:32.483 回答