我希望根据数据上下文的属性来折叠某些ListBoxItems。
我想出了以下内容(为了简洁而修剪)
<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”的listboxitems,但是垂直滚动条不会调整“缺失”项。当我滚动时,突然间条形变得越来越大(没有移动),直到我滚过隐藏物品的点,然后最终开始移动。
我也尝试在数据触发器中明确地将高度和宽度设置为0,但无济于事。
有没有人知道是否有针对此的解决方法?
答案 0 :(得分:1)
您可以做的一件事是通过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:
创建CollectionViewDim 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)
我通常在可隐藏的扩展器中有复选框或Radiobuttons,可以让我来回更改我的过滤选项。这些属性绑定到属性,每个属性运行过滤器函数,该函数计算所有过滤器,然后返回该项是否应该出现。
请告诉我这是否适合您。
我差点忘了:
<ListBox ItemsSource="{Binding Source={StaticResource cvsItems}}"/>
答案 1 :(得分:0)
答案是在列表框中设置VirtualizingStackPanel.IsVirtual =“False”。