Медленный DataGrid в ItemsControl - PullRequest
0 голосов
/ 25 мая 2018

У меня очень медленный ItemsControl, содержащий до 5 DataGrids.(отображается рядом друг с другом) Каждый раз, когда я обновляю этот элемент управления, весь мой пользовательский интерфейс запаздывает (~ 10 секунд).Каждый Datagrid имеет ~ 50-100 элементов с 4 предопределенными столбцами (не генерируется автоматически).Источники предметов в сетках обновляются одновременно.

Вот мой XAML:

        <ScrollViewer Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto">
        <ItemsControl x:Name="icjudges"  ItemsSource="{Binding Judges}" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <StackPanel Orientation="Horizontal" Grid.Row="0">
                            <TextBlock Text="{Binding Fullname}" Margin="4" />
                        </StackPanel>
                        <DataGrid Grid.Row="1" Margin="4,0" ScrollViewer.CanContentScroll="False" ItemsSource="{Binding}" SelectionUnit="FullRow" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling" AutoGenerateColumns="False" SelectedIndex="0" AlternationCount="2" SelectionMode="Single" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True">
                            <DataGrid.DataContext>
                                <CollectionViewSource>
                                    <CollectionViewSource.Source>
                                        <MultiBinding Converter="{StaticResource selectedtrickrankingconv}">
                                            <Binding Path="TrickRankings" />
                                            <Binding Path="DataContext.CurrentRunEntry.SelectedTrick" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" />
                                        </MultiBinding>
                                    </CollectionViewSource.Source>
                                </CollectionViewSource>
                            </DataGrid.DataContext>
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Rank" Binding="{Binding Rank}" HeaderStyle="{StaticResource centerheaderstyle}" MinWidth="20" CellStyle="{StaticResource centercellstyle}" />
                                <DataGridTextColumn Header="Name" Binding="{Binding Trick.Entry.Athlete.NameShort}" HeaderStyle="{StaticResource leftheaderstyle}"   MinWidth="100" />
                                <DataGridTextColumn Header="Run" Binding="{Binding Trick.Entry.Run.Number}"  HeaderStyle="{StaticResource centerheaderstyle}"  MinWidth="20" CellStyle="{StaticResource centercellstyle}" />
                                <DataGridTextColumn Header="Score" Binding="{Binding ValueFormatted}"  HeaderStyle="{StaticResource rightheaderstyle}"   MinWidth="30" CellStyle="{StaticResource rightcellstyle}" />
                            </DataGrid.Columns>
                        </DataGrid>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>

Любые идеи, как я могу ускорить этот процесс рендеринга?Для меня очень важно, чтобы мой интерфейс оставался отзывчивым при обновлении данных.Я также пытался заменить Datagrids на ListViews, но он почти такой же медленный, как и раньше.

Мне кажется, я нашел проблему, вот конвертер, который предоставляет данные:

    public class SelectedTrickJudgeScoreRankingsConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Count() != 2)
            return null;
        if (values.Any(x => x == DependencyProperty.UnsetValue || x == null))
            return null;

        IEnumerable<JudgeRanking> Rankings = (IEnumerable<JudgeRanking>) values[0];
        Trick CurrentTrick = (Trick)values[1];

        return Rankings.FirstOrDefault(t => t.Trick.Number == CurrentTrick.Number).ScoresSorted;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

    public IEnumerable<Score> ScoresSorted
    {
        get { return Scores.Where(s => s.IsValid).OrderBy(s => s.Rank); }
    }

public bool IsValid
    {
        get
        {
            if (Value == null)
                return false;
            if (Value.Value >= (decimal)Trick.Entry.ContestPart.MinScore && Value.Value <= (decimal)Trick.Entry.ContestPart.MaxScore)
                return true;
            return false;
        }
    }

, еслия возвращаю ScoresSorted это очень медленно, если я только возвращаю Scores (не отсортировано), это намного быстрее, но я понятия не имею, что изменить, потому что мне нужно отсортировать

Я запрограммировал небольшое тестовое приложение, которое демонстрирует отставаниеПользовательский интерфейс, вы можете скачать его здесь.https://1drv.ms/u/s!AreXFr2kgVXYjacFH0-MZsnOARPLEA

KR Manu

1 Ответ

0 голосов
/ 25 мая 2018

Я тоже застрял на этом поведении.Но я нашел обходной путь, заменив эти DataGrids на ListBox и переопределив их ItemsPanel следующим образом:

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
          <UniformGrid Columns="1"/>
   </ItemsPanelTemplate>
</ListBox.ItemsPanel>

, а перед этим просто создайте сетку с количеством нужных вам столбцов.(для того, чтобы смоделировать заголовки).

Это прекрасно работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...