0

ListBox使用从导致过滤ItemSource变慢的自定义控件的模板。过滤是在ItemSource控件绑定到的 get 中完成的。使用normal 时不存在此问题ListBox,那么为什么对于 custom 会有任何不同ListBox

过滤:

public IEnumerable<LibraryViewModel> Libraries {
    get {
        if (!string.IsNullOrEmpty(this.LibrarySearchString))
            return _libraries.Where(lib => IsLibraryMatch(lib, this.LibrarySearchString));
        else
            return _libraries.OrderBy(lib => !lib.IsFavourite);
    }
}  

使用控件:

<con:FilterListBox Grid.Row="1"
                   ItemsSource="{Binding Libraries}"
                   SelectedItem="{Binding SelectedLibrary}"
                   ItemTemplate="{StaticResource  
                                  LibraryItemTemplate}"                           
                   SearchString="{Binding LibrarySearchString, Mode=TwoWay}"
                   IsSearching="False"
                   Margin="4"/>

控制模板:

<Style x:Key="{x:Type con:FilterListBox}" TargetType="{x:Type con:FilterListBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type con:FilterListBox}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>

                    <DockPanel Grid.Row="0">
                        <TextBlock Text="Search"
                                    VerticalAlignment="Center"/>
                        <TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                Path=SearchString,
                                                UpdateSourceTrigger=PropertyChanged}"
                                 Margin="4,0,0,0"/>
                    </DockPanel>

                    <ScrollViewer Grid.Row="1" CanContentScroll="True">
                        <StackPanel IsItemsHost="True"
                                    HorizontalAlignment="Stretch"/>
                    </ScrollViewer>

                    <TextBlock Grid.Row="1"
                               Text="Searching..."
                               HorizontalAlignment="Center"
                               VerticalAlignment="Center"
                               Visibility="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                    Path=IsSearching,
                                                    Converter={StaticResource CollapsedIfFalseConverter}}"/>
                </Grid>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

谢谢你的帮助。

4

1 回答 1

4

您的缓慢行为FilterListBox可能伴随着虚拟化问题。您将 ItemsHost 替换为ListBox简单的StackPanel. 默认情况下,ListBox 使用 a VirtualizingStackPanel,它会尽可能虚拟化 Items。请参阅默认列表框模板作为参考。如果您有一个简单的 StackPanel 作为 ItemsPresenter,则 ListBox 必须在您的过滤器更改时重新呈现每个项目。根据项目的数量,这可能会导致您的行为缓慢。尝试改用默认的 itemshost。您还应该知道,虚拟化仅适用于“简单”项目(基本上每个项目的高度相同)。

于 2012-10-01T16:05:30.597 回答