WPF - 当VirtualizingStackPanel为ListView创建项目时需要一个事件

时间:2010-10-21 00:15:59

标签: wpf listview controls datatemplate virtualizingstackpanel

有没有办法告诉容器何时完成为ListView制作?

到目前为止我所做的详细解释

我有一个ListView控件,其中一个包含CheckBox控件的列中有一个DataTemplate。我已经想出了如何使用ListView绑定的对象动态访问CheckBox。

                ListViewItem lItem = (ListViewItem)ListView.ItemContainerGenerator.ContainerFromItem(trackToHandle);
                CheckBox checkBoxToHandle = FindChild<CheckBox>(lItem, "CheckBox");

问题是每当我滚动太远或每次对列进行排序时,CheckBox都会“重置”(取消选中)。 我想出这是因为VirtualizingStackPanel只是为那些可见(或几乎可见)的ListViewItem吐出容器。 并且因为CheckBox位于XAML中定义的DataTemplate内部,所以每当它离开视图或列表被排序时它就会被抛弃。

我通过创建一个单独的CheckBoxes列表并使用实际的CheckBoxes“click”事件来改变我列表中相应CheckBox的状态来解决这个问题。然后做了一个小方法来改变所有可见的状态用户滚动时CheckBoxes ...因此它看起来应该首先出现。

除非我对列进行排序。 我试图让它在排序列之后立即重新做CheckBoxes(就像之前一样),但它没有用。 我最好的猜测是,在我排序后它不能立即制作容器。

有没有办法告诉容器何时完成为ListView制作?

1 个答案:

答案 0 :(得分:1)

如果将复选框IsChecked属性绑定到数据上下文的布尔属性,则不会出现此问题。

VirtualizingStackPanel的全部目的是通过不创建ListItem来减少内存使用量,除非需要。

实际上,您需要将复选框的数据面移离控件。