Как предотвратить пересчет сетки данных sh при привязке данных с помощью IsAsyn c в WPF - PullRequest
0 голосов
/ 24 марта 2020

У меня есть задача, которая помещает журналы android logcat в сетку данных WPF. Проблема возникает при запуске приложения, огромные журналы (~ 80 000 строк журнала) должны быть загружены в сетку данных. Итак, у меня есть 2 решения для этой проблемы:

  • Во-первых, если я использую ObservableCollection в качестве ItemSource, сетка данных будет обновляться построчно. Загрузка занимает ~ 10 000 строк => слишком медленно ... Не использовать IsAsyn c
  • Затем я использую List в качестве ItemSource и устанавливаю IsAsyn c в правда. Я связываю данные программно каждую добавленную строку (или каждые 100,1000 добавленных строк). Для загрузки ~ 90.000 строк требуется всего 20 секунд. Но сетка данных обновляет (перезапускает) каждый вызываемый notifyChange, поэтому я ничего не могу сделать в сетке данных. Используйте IsAsyn c

Если у вас есть какое-либо решение для решения этой проблемы или просто решение для предотвращения обновления сетки данных, пожалуйста, помогите мне. Большое спасибо ~

Просмотр:

<DataGrid AutoGenerateColumns="False"
      HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" ItemsSource="{Binding LogItemVMs,UpdateSourceTrigger=PropertyChanged,Mode=OneWay,IsAsync=True}"
      EnableColumnVirtualization="True" EnableRowVirtualization ="True" VirtualizingStackPanel.IsVirtualizing ="True" VirtualizingStackPanel.VirtualizationMode="Recycling"
      VirtualizingPanel.ScrollUnit="Pixel"
      GridLinesVisibility="None">
<DataGrid.Columns>
    <DataGridTemplateColumn Header="Line" Width="auto">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Line,UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

ViewModel

public List<LogItemVM> LogItemVMs { get; set; }
private void executeCmd()
{
new Thread(() =>
{
    Process cmd = _commandImpl.CreateProcess("adb logcat -v threadtime");

    try
    {
        cmd.Start();
        string line;
        LogCount = 0;
        while ((line = cmd.StandardOutput.ReadLine()) != null)
        {
            LogInfo lif = _logInfoManager.ParseLogInfos(line);
            if (lif != null)
            {
                LogItemVM livm = new LogItemVM(lif);
                System.Windows.Application.Current.Dispatcher.BeginInvoke(
                    DispatcherPriority.Background,
                    new Action(() =>
                    {
                        LogItemVMs.Add(livm);
                        LogCount++;
                        //if ((int)livm.Line % 1000 == 0)
                        onChanged(this, "LogItemVMs");
                        onChanged(this, "LogCount");
                    }));
            }
        }
    }
    catch { }
    finally
    {
        if (!cmd.HasExited)
            cmd.Kill();
    }
}).Start();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...