WPF - Скрыть элементы в ItemControl -> UniformGrid от использования пространства пользовательского интерфейса на основе привязки данных - PullRequest
3 голосов
/ 02 июня 2019

С привязкой к 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>

Обновление: Я не просто скопировал и вставил весь ответ.

  1. Вкод выше, в Button, внутри DataTemplate, я удалил строку Visibility.
  2. Я только добавил следующий код:

            <ItemsControl.ItemContainerStyle>
                <Style TargetType="ContentPresenter">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsVisible}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ItemsControl.ItemContainerStyle>
    

1 Ответ

5 голосов
/ 03 июня 2019

Не влияет на видимость кнопки в шаблоне данных. Вместо этого вы должны установить видимость контейнера элементов, то есть ContentPresenter, который отображает отдельные элементы.

Этого можно добиться, установив ItemContainerStyle ItemsControl в стиль с помощью Setter, который связывает свойство Visibility, или с DataTrigger вместо Binding with Converter.

<ItemsControl ItemsSource="{Binding}">
    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <ScrollViewer VerticalScrollBarVisibility="Visible">
                <ItemsPresenter />
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="5" VerticalAlignment="Top"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button ... />
        </DataTemplate>
    </ItemsControl.ItemTemplate>

    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsVisible}" Value="False">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>
...