【问题标题】:WPF ListBoxItem Visibility and ScrollBarWPF ListBoxItem 可见性和滚动条
【发布时间】:2011-10-03 02:44:05
【问题描述】:

我希望根据数据上下文的属性折叠某些 ListBoxItem。

我想出了以下内容(为简洁起见)

<ListBox ItemsSource="{Binding SourceColumns}">
     <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
              <DataTrigger Binding="{Binding IsDeleted}" Value="True">
                 <Setter Property="Visibility" Value="Collapsed"/>
              </DataTrigger>
            </Style.Triggers>
         </Style>
      </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
       <DataTemplate>
         <TextBlock VerticalAlignment="Center" Margin="5,0" Text="{Binding ColumnName}"/>
       </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这个“有效”是因为它确实折叠了标记为“IsDeleted”的列表框项,但是垂直滚动条不会针对“缺失”项进行调整。当我滚动时,栏突然变得越来越大(没有移动),直到我滚动到隐藏项目的点,然后终于开始移动。

我还尝试在数据触发器中将高度和宽度显式设置为 0,但无济于事。

有人知道是否有解决方法吗?

【问题讨论】:

    标签: wpf scrollbar visibility listboxitem


    【解决方案1】:

    输入 CollectinViewSource

    您可以做的一件事是通过 CollectionViewSource 将您的 ListBox 连接到您的项目。

    您所做的是在 XAML 中创建 collectionViewSource:

    <Window.Resources>
        <CollectionViewSource x:Key="cvsItems"/>
    </Window.Resources>
    

    在您的 CodeBehind 或 ViewModel 中连接到它

    Dim cvsItems as CollectionViewSource
    cvsItems = MyWindow.FindResource("cvsItems")
    

    并将它的源属性设置为您的项目集合。

    cvsItems.Source = MyItemCollection
    

    然后您可以对其进行过滤。 collectionViewSource 维护集合中的所有项目,但会根据您告诉它的内容更改这些项目的视图。

    过滤

    要过滤,请使用您的 CollectionViewSource 创建一个 CollectionView:

    Dim MyCollectionView as CollectionView = cvsItems.View
    

    接下来写一个过滤函数:

    Private Function FilterDeleted(ByVal item As Object) As Boolean
        Dim MyObj = CType(item, MyObjectType)
        If MyObj.Deleted = True Then Return False Else Return True End If
    End Function
    

    最后,写一些让魔法发生的事情:

    MyCollectionView .Filter = New Predicate(Of Object)(AddressOf FilterDeleted)
    

    我通常在可隐藏的扩展器中有复选框或单选按钮,可以让我来回更改过滤选项。这些都绑定到属性,每个属性都运行过滤器函数,该函数评估所有过滤器,然后返回该项目是否应该出现。

    让我知道这是否适合你。

    编辑:

    我差点忘了:

    <ListBox ItemsSource="{Binding Source={StaticResource cvsItems}}"/>
    

    【讨论】:

    • 啊,好棒的 collectionviewsource。我的解决方案将要求它更具动态性,但我会试一试。谢谢。
    • 我用 CollectionViewSource 做了一些非常简洁的事情。我制作了一个连续过滤器(按您键入的过滤器),并编写了过滤器和分组方法,可以以 20 种不同的方式影响对象。我真正想要的是一种针对 CollectionViewSource 进行动画处理的方法。我遇到的问题是,每当您应用过滤器或您拥有什么时,它都会刷新视图。当它这样做时,它会重新加载所有项目。但是,如果我想让过滤掉的项目褪色然后折叠怎么办?好像做不到……
    • 完美运行,谢谢。为了简单起见,我通常只是绑定到可观察的集合,但是在更复杂的场景中我往往会忘记 CollectionViewSource 选项。再次感谢。
    【解决方案2】:

    答案是在列表框中设置 VirtualizingStackPanel.IsVirtual="False"。

    Why don't my listboxitems collapse?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多