Как убрать мерцание CheckBox'ов при обновлении данных в wpf?

Есть ListBox c данными. Данные обновляются, добавляются примерно 1 раз в секунду. Данные при каждом обновлении должны сортироваться по определенному параметру. Все строки данных имеют CheckBox для отметки, нужно ли их обновлять дальше. В случае, когда происходит обновление отсортированных данных в ListBox, все CheckBox'ы перерисовываются в связи с чем и происходит мерцание отмеченных галочкой CheckBox'ов.
Выглядит следующим образом:
<ListBox x:Name="lstbx" ItemsSource="{Binding Data.IDs}" SelectionMode="Single" SelectedItem="{Binding selectedID}"
HorizontalAlignment="Left" MinHeight="305" Margin="5" VerticalAlignment="Top" MinWidth="169" FontSize="10">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Margin="0,2">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="20"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <CheckBox IsChecked="{Binding Enable}" VerticalAlignment="Center"/>
                <TextBlock VerticalAlignment="Stretch" Grid.Column="1">
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0}: {1}">
                            <Binding Path="Name"/>
                            <Binding Path="DiffCount"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Демонстрация проблемы: Файл с видео в .AVI (196 кб)
Вопрос, соответственно, как избежать такой проблемы, как мерцание в данном случае?

И, вдогонку, каким образом лучше всего производить сортировку данных в ListBox?
Изначально при каждом изменении IDs[i].DiffCount вызывал событие PropertyChanged, а в обработчике события устанавливал сортировку:
lstbx.Items.SortDescriptions.Clear();
lstbx.Items.SortDescriptions.Add(new System.ComponentModel.SortDescription("DiffCount", System.ComponentModel.ListSortDirection.Descending));

Но как-то мне этот результат не понравился и я поменял на вариант с созданием новой коллекции отсортированной из исходной, после чего просто заменял старую на новую:
var idTemp = IDs.OrderByDescending(i => i.DiffCount).Select(i => i);
var newIDs = new Collection();
foreach (var id in idTemp)
    newIDs.Add(id);
IDs = newIDs;
  • Вопрос задан
  • 546 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Hydro
C#/.NET Developer
По поводу сортировки:
<ListBox Loaded="ListBoxOnLoadedHandler">
</ListBox>


private void ListBoxOnLoadedHandler(object sender, RoutedEventArgs e)
      {
        var listbox = sender as ListBox;
        if (listbox == null)
          return;
        var view = CollectionViewSource.GetDefaultView(listbox.ItemsSource);
        view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
      }


А что значит мерцает? Мерцают именно галочки? или мерцает фокус? можете поподробнее описать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы