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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM