Принудительно динамический список WPF всегда отображает последнюю строку
У меня есть список, который отображает ObservableCollection, который растет в ответ на произвольные события. Я бы хотел, чтобы самая старая запись была вверху, и когда я добавляю новые записи, я бы хотел, чтобы список прокручивался вниз, чтобы всегда отображалась последняя строка. По умолчанию ScrollView остается вверху, а новые строки не отображаются.
Что я уже пробовал:
Мой код model () для коллекции содержит
public class MyModel : Notifiable, INotifyPropertyChanged { public ObservableCollection<string> Commands { get; set; } = new ObservableCollection<string>(); public void UpdateCommands(string msg) { Commands.Insert(0, msg); OnPropertyChanged("SystemStatusLB"); } }
Мой XAML содержит
<GroupBox Header="System Status"> <ScrollViewer Name="SystemStatusSV"> <ListBox x:Name="SystemStatusLB" ItemsSource="{Binding Model.Commands}" MaxHeight="300"> </ListBox> </ScrollViewer> <GroupBox>
Мой код xaml.cs содержит
public partial class MyView : UserControl { public MyModel Model { get; set; } = MyModel.Instance(); protected DispatcherTimer UpdateTimer { get; set; } public MyView() { InitializeComponent(); UpdateTimer = new DispatcherTimer {Interval = new TimeSpan(0, 0, 1) }; UpdateTimer.Tick += new EventHandler(UpdateTimer_Tick); UpdateTimer.Start(); } public void UpdateTimer_Tick(object sender, EventArgs e) { // I have tried various techniques here to update the ScrollView to display the last row without success // The following IF statement never resolves to true so the contents are not executed if (SystemStatusLB.ItemContainerGenerator.ContainerFromIndex(Model.Commands.Count-1) is FrameworkElement container) { var transform = container.TransformToVisual(SystemStatusSV); var elementLocation = transform.Transform(new Point(0, 0)); double newVerticalOffset = elementLocation.Y + SystemStatusSV.VerticalOffset; SystemStatusSV.ScrollToVerticalOffset(newVerticalOffset); } // I have also tried calling SystemStatusSV.ScrollToVerticalOffset(280); // MaxHeight less one row of pixels SystemStatusLB.MoveCurrentToLast(); } }