WPF ListBoxItem Visibility и ScrollBar - PullRequest
       33

WPF ListBoxItem Visibility и ScrollBar

2 голосов
/ 12 июля 2011

Я надеялся свернуть определенные элементы 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», однако вертикальная полоса прокруткине корректировать на «пропущенные» предметы.Когда я прокручиваю, панель внезапно становится все больше и больше (без движения), пока я не прокручиваю точку скрытых предметов, а затем, наконец, не начинаю двигаться.

Я также попытался явно установитьВысота и ширина до 0, а также в триггере данных, но безрезультатно.

Кто-нибудь знает, есть ли обходной путь для этого?

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Введите CollectinViewSource

Одна вещь, которую вы можете сделать, это подключить ваш ListBox к вашим элементам через CollectionViewSource.

Что вы делаете, это создаете collectionViewSource в XAML:

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

Подключитесь к нему в вашем CodeBehind или ViewModel

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

и установите его свойство source для вашей коллекции элементов.

cvsItems.Source = MyItemCollection

Затем вы можете выполнить фильтрацию по нему.CollectionViewSource поддерживает все элементы в коллекции, но изменяет представление этих элементов в зависимости от того, что вы ему сообщаете.

Фильтрация

Чтобы отфильтровать, создайте CollectionView с помощью CollectionViewSource:

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)

У меня обычно есть флажки или кнопки Radiobutton в скрытомрасширитель, который позволяет мне изменять параметры фильтрации назад и вперед.Они связаны со свойствами, каждое из которых выполняет функцию фильтра, которая оценивает все фильтры и затем возвращает, должен ли элемент появляться или нет.

Дайте мне знать, если это работает для вас.

Редактировать:

Я почти забыл:

<ListBox ItemsSource="{Binding Source={StaticResource cvsItems}}"/>
0 голосов
/ 26 августа 2011

Ответ состоит в том, чтобы установить VirtualizingStackPanel.IsVirtual = "False" в вашем списке.

Почему мои списки не разрушаются?

...