У меня очень медленный 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