0

から派生したカスタム コントロールのテンプレートを使用すると、のListBoxフィルタリングがItemSource遅くなります。フィルタリングはItemSource、コントロールがバインドされている の get で行われます。この問題は法線ListBoxが使用されている場合には存在しないのに、なぜカスタムで異なる必要があるの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 はVirtualizingStackPanel可能な限り項目を仮想化する を使用します。デフォルトの ListBox テンプレートを参照してください。ItemsPresenter として単純な StackPanel がある場合、ListBox はフィルターが変更されたときにすべてのアイテムを再レンダリングする必要があります。アイテムの数によっては、これにより動作が遅くなる可能性があります。代わりに、デフォルトの itemshost を使用してみてください。また、仮想化は「単純な」アイテム (基本的にすべてのアイテムで同じ高さ) でのみ可能であることも知っておく必要があります。

于 2012-10-01T16:05:30.597 に答える