WPF CollectionViewSource.GetDefaultView ICollectionViewLiveShaping IsLiveSorting
<Window x:Class="WpfApp147.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp147" mc:Ignorable="d" WindowState="Maximized" Title="MainWindow" Height="450" Width="800"> <Grid> <ListBox x:Name="lbx" ItemsSource="{Binding}"> <ListBox.ItemTemplate> <DataTemplate> <Border Margin="2" Padding="4" BorderThickness="3" BorderBrush="Blue"> <StackPanel Orientation="Horizontal" TextBlock.FontSize="20"> <TextBlock Foreground="Blue" FontWeight="Bold" Text="{Binding Name,StringFormat='Name:{0}'}"/> <TextBlock Foreground="Red" Margin="10,0,0,0" FontSize="20" Text="{Binding Value,StringFormat='Value:{0}'}"/> </StackPanel> </Border> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </Window> //cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Diagnostics; using System.ComponentModel; using System.Collections.ObjectModel; namespace WpfApp147 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { ObservableCollection<StockItem> _items; public MainWindow() { InitializeComponent(); InitItems(); var view = CollectionViewSource.GetDefaultView(_items); view.SortDescriptions.Add(new SortDescription( "Value", ListSortDirection.Ascending)); var listView = (ICollectionViewLiveShaping)CollectionViewSource.GetDefaultView(_items); listView.IsLiveSorting = true; this.DataContext= view; } private void InitItems() { _items = new ObservableCollection<StockItem>(); Random rnd = new Random(); for (int i = 0; i < 100; i++) { _items.Add(new StockItem() { Name = $"Name_{i + 1}", Value = rnd.Next(1, 1000000) }); } } } class StockItem : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged = delegate { }; public string Name { get; set; } double _value; public double Value { get { return _value; } set { _value = value; PropertyChanged(this, new PropertyChangedEventArgs("Value")); } } } }