WPF ListBox如何实现动态加载数据,并且滚动条自动下拉

一、绑定

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"));
            }
        }

    }
}
View Code

二、自动滚动

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]);
        }

 

posted @ 2017-08-29 15:11  影子张  阅读(7873)  评论(1编辑  收藏  举报