С привязкой к ObservableCollection
, я заполняю ItemsControl
Buttons
.Я использую UniformGrid
, чтобы помочь равномерно распределить, есть ли 5 или 5000 объектов в ObservableCollection
.
Желание: после того, как пользователь выполнит поиск / фильтрацию ObservableCollection
, я хотел бы обновить свойство IsVisible
для элементов, чтобы показать / скрыть их ..., а также консолидировать пространство.
Обоснование: я подумал, что с точки зрения производительности обновление свойства было бы лучше, чем выполнение цикла Clear()
и повторного добавления отфильтрованных элементов обратно в базу данных ObservableCollection
.
Проблема: при текущей реализации(код ниже) действительно скрывает кнопки, пространство, которое они занимают, все еще присутствует, независимо от того, какое свойство Visibility
я пытаюсь использовать.
Отказ от ответственности: я открыт для большего, чем просто для «исправления» моеготекущий кодНапример, если жизнеспособное решение не использует, например, UniformGrid
, но все же достигает устойчивого результата, я, вероятно, могу его использовать!То же самое относится и к стороне ViewModel
.
<ItemsControl Name="ItemsList"
Width="Auto"
HorizontalContentAlignment="Left"
ItemsSource="{Binding ItemsVM.WorkList}"
ScrollViewer.CanContentScroll="True" VirtualizingStackPanel.IsVirtualizing="true"
VirtualizingStackPanel.VirtualizationMode="Standard"
>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="5" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button
Width="250" Height="50"
FontSize="18" FontWeight="Bold"
Background="{Binding TextColor, Converter={StaticResource TextToColorConvert}, UpdateSourceTrigger=PropertyChanged}"
Margin="1,1,1,1" HorizontalAlignment="Center" VerticalAlignment="Center"
BorderBrush="WhiteSmoke" BorderThickness="0" Click="workNumSelect"
Content="{Binding Workload.WorkNum}"
Cursor="Hand" Opacity=".8"
Visibility="{Binding IsVisible, Converter={StaticResource BoolToCollapsedVisConvert}, UpdateSourceTrigger=PropertyChanged}"
/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<ScrollViewer Width="Auto" VerticalScrollBarVisibility="Visible">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
Обновление: Я не просто скопировал и вставил весь ответ.
- Вкод выше, в
Button
, внутри DataTemplate
, я удалил строку Visibility
. Я только добавил следующий код:
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Style.Triggers>
<DataTrigger Binding="{Binding IsVisible}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.ItemContainerStyle>