数据绑定(bind)到ObservableCollection,我用ItemsControl填充Buttons。我正在使用UniformGrid来帮助在ObservableCollection中均匀分布5个或5000个对象。

需求:用户搜索/过滤ObservableCollection后,我想更新商品的IsVisible属性以显示/隐藏它们...同时还要巩固空间。

原理:我认为,从性能角度来看,更新属性要比做Clear()并循环以将过滤后的项重新添加回数据绑定(bind)的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>
    
  • 最佳答案

    在DataTemplate中设置按钮的可见性无效。您应该设置项目容器的可见性,即显示单个项目的ContentPresenter

    您可以通过将ItemsControl的ItemContainerStyle设置为具有绑定(bind)Visibility属性的Setter的样式,或者使用DataTrigger而不是使用Converter的绑定(bind)来设置样式。

    <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>
    

    10-06 14:08
    查看更多