一、綁定
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]); }