【问题标题】:WPF ListView virtualization. How to disable ListView virtualization?WPF ListView 虚拟化。如何禁用 ListView 虚拟化?
【发布时间】:2014-04-29 17:51:12
【问题描述】:

我在使用自定义 ListView 时遇到了一些问题(滚动 ListView 时,里面的复选框丢失了它们的状态)。我可以在不枚举可视化树的情况下禁用 ListView 虚拟化吗?

<ListView>
    <ListView.Resources>
        <Style TargetType="GridViewColumnHeader">
            <Setter Property="Visibility" Value="Collapsed" />
        </Style>
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Address">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox Content="{Binding Address}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Name">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

【问题讨论】:

  • 不要禁用虚拟化。只需将复选框的IsChecked 属性绑定到某个相关的布尔值。
  • ListBox is virtual by default? 的可能重复项
  • 关于绑定是个好主意,但是当我在 Snoop 中更改 ListView 的私有属性时(VirtualizingPanel.IsVirtualising 和 VirtualizingPanel.IsContainerVirtualizable)一切正常。
  • 看我的回答。尝试关闭回收。
  • 我在 ListView 中只有大约 50 条记录。性能不重要。

标签: c# .net wpf listview


【解决方案1】:

正如 H.B. 所说。在their answer here:

设置 VirtualizingStackPanel.IsVirtualizingListView 上设置为 false 或设置正常 StackPanel 作为 ListView.ItemsPanel.

<ListView VirtualizingStackPanel.IsVirtualizing="False"/>

<ListView>
 <ListView.ItemsPanel>
     <ItemsPanelTemplate>
       <StackPanel></StackPanel>
      </ItemsPanelTemplate>
  </ListView.ItemsPanel>
 </ListView>

【讨论】:

  • 重要的是要提到这是一个 HACK,应该避免。 OP 的问题是 CheckBox.IsChecked 属性缺少 DataBinding,禁用虚拟化不是解决方案。
  • @HighCore 知道您可以关闭虚拟化仍然是件好事。您不希望一直虚拟化。
  • additional state information associated with an item container - 你总是可以使用附加属性或其他东西。禁用虚拟化是一种 HACK。对不起。
  • @HighCore 不适用于 TreeView 和 1-n 个孩子并且不想使用 Recycling/Standard 并且不想用附加属性弄乱我的东西,抱歉。不是特别是如果它不是必需的。 KISS.
  • 提醒一下,当您复制他人的话时,您必须提供适当的署名,就像我在上面所做的那样。
【解决方案2】:

除了绑定 IsChecked 属性

您可能还需要关闭回收功能

VirtualizingStackPanel.VirtualizationMode="Standard" 

VirtualizationMode Enumeration

【讨论】:

  • 但对我来说有些奇怪:当我在 Snoop 中查看 ListView 时,它显示的是 VirtualizingPanel 而不是 VirtualizingStackPanel。
  • 答案如何?最多应该是对上述答案的评论。除非你有什么想法,但我看不懂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多