Есть 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;