1

有什么方法可以判断何时为 ListView 制作容器?

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

我有一个 ListView 控件,它的其中一个列中有一个 DataTemplate,其中包含一个 CheckBox 控件。我已经弄清楚如何使用 ListView 绑定到的对象动态访问 CheckBox。

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

问题是,每当我滚动得太远或对列进行排序时,复选框都会“重置”(变为未选中)。我发现这是因为 VirtualizingStackPanel 只为那些可见(或几乎可见)的 ListViewItems 吐出容器。而且因为 CheckBox 位于 XAML 中定义的 DataTemplate 内,所以每次它消失时都会被丢弃或当列表排序时。

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

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

有什么方法可以判断何时为 ListView 制作容器?

4

1 回答 1

1

如果您将您的复选框 IsChecked 属性绑定到数据上下文中的布尔属性,那么您将不会遇到此问题。

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

实际上,您需要将复选框的数据侧从控件移开。

于 2010-10-21T03:50:26.643 回答