一、绑定
ListBox绑定ViewModel中的string链表,注意不能用普通的List<string>,需要定义ObservableCollection<string>(如果用List<string>,界面刷新会有所延迟)
XAML(DataContext为viewModel):
<ListBox x:Name="StatusList" ItemsSource="{Binding ListStatus}" />
ViewModel:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel; using System.Collections.ObjectModel; using System.Windows.Controls; using System.IO; using System.IO.Ports; using System.Data; using System.Windows.Threading; namespace SPT { public class ViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) PropertyChanged(this, e); } private ObservableCollection<string> listStatus = new ObservableCollection<string> { }; public ObservableCollection<string> ListStatus { get { return listStatus; } set { listStatus = value; OnPropertyChanged(new PropertyChangedEventArgs("ListStatus")); } } } }
二、自动滚动
ListBox有ScrollIntoView方法,但是在ViewModel中添加删除ListStatus时,不能直接调用此方法,故要增加一个委托定义,以控制界面元素:
1.ViewModel中定义更改列表方法:
/// <summary> /// 增加状态信息到列表里 /// </summary> public void AddItemsToStatus(bool isCommand, string strStatus) { ListStatus.Add(strStatus); FocusLastItem(); } /// <summary> /// 委托定义,用于控制界面元素 /// </summary> public delegate void ScrollToEnd(); public ScrollToEnd FocusLastItem = null;
2.在主界面后台代码中增加自动滚动条方法:
public MainWindow() { InitializeComponent(); ViewModel vm= (ViewModel)this.DataContext; vm.FocusLastItem += AutoScroll; } /// <summary> /// 滚动条自动滚动 /// </summary> private void AutoScroll() { StatusList.ScrollIntoView(StatusList.Items[StatusList.Items.Count - 1]); }