C# 如何在WPF中使用计时器刷新数据网格后将所选内容保留到DataGrid行

C# 如何在WPF中使用计时器刷新数据网格后将所选内容保留到DataGrid行,c#,wpf,wpfdatagrid,C#,Wpf,Wpfdatagrid,我有WPF DataGrid,我正在绑定DataGrid,但如果对数据进行任何更改,它将自动刷新,但我对DataGrid行的选择将取消选中 不要使用列表来存储数据,请尝试使用可观察收集。使用ObservableCollection的优点是,每当您向集合中添加项目时,UI都会自动更新,因此不需要手动刷新数据网格。下面我分享了一个示例应用程序,它在DataGrid中添加和更新记录 XAML: 代码隐藏: using System; using System.Windows; using Syst

我有WPF DataGrid,我正在绑定DataGrid,但如果对数据进行任何更改,它将自动刷新,但我对DataGrid行的选择将取消选中

不要使用
列表
来存储数据,请尝试使用
可观察收集
。使用
ObservableCollection
的优点是,每当您向集合中添加项目时,UI都会自动更新,因此不需要手动刷新
数据网格。下面我分享了一个示例应用程序,它在
DataGrid
中添加和更新记录

XAML:


代码隐藏:

using System;
using System.Windows;
using System.Timers;
using System.Collections.ObjectModel;
using System.Windows.Threading;
using System.ComponentModel;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Timer _timer = null;
        ObservableCollection<CustomMessage> _messages = null;

        int count = 0;

        public MainWindow()
        {
            InitializeComponent();
            _messages = new ObservableCollection<CustomMessage>();
            count++;
            _messages.Add(new CustomMessage() { ID = count, Message = "Message" });
            _timer = new Timer(1000);
            _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);

            this.DGNew.ItemsSource = _messages;
            _timer.Start();
        }

        void _timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                _timer.Stop();
                Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
                {
                    if (this.CBAdd.IsChecked == true)
                    {
                        count++;
                        _messages.Add(new CustomMessage() { ID = count, Message = "Timer Message " + count });
                    }
                    else
                    {
                        // Udpate existing Message
                        Random random = new Random();
                        CustomMessage message = _messages[random.Next(0, count)];
                        message.Message = "Updated Time" + DateTime.Now.ToLongTimeString();
                    }
                }));
            }
            finally
            {
                _timer.Start();
            }
        }
    }

    public class CustomMessage : INotifyPropertyChanged
    {
        private int _ID;

        public int ID
        {
            get { return _ID; }
            set
            {
                _ID = value;
                OnPropertyChanged("ID");
            }
        }

        private string _Message;

        public string Message
        {
            get { return _Message; }
            set
            {
                _Message = value;
                OnPropertyChanged("Message");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
使用系统;
使用System.Windows;
使用系统计时器;
使用System.Collections.ObjectModel;
使用System.Windows.Threading;
使用系统组件模型;
命名空间WpfApplication1
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
计时器_Timer=null;
ObservableCollection_messages=null;
整数计数=0;
公共主窗口()
{
初始化组件();
_消息=新的ObservableCollection();
计数++;
_添加(new CustomMessage(){ID=count,Message=“Message”});
_定时器=新定时器(1000);
_timer.appeased+=新的ElapsedEventHandler(_timer_appeased);
this.DGNew.ItemsSource=\u消息;
_timer.Start();
}
无效\u计时器\u已过(对象发送器,ElapsedEventArgs e)
{
尝试
{
_timer.Stop();
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,新操作(()=>
{
if(this.CBAdd.IsChecked==true)
{
计数++;
_添加(new CustomMessage(){ID=count,Message=“Timer Message”+count});
}
其他的
{
//Udpate现有消息
随机=新随机();
CustomMessage message=_messages[random.Next(0,count)];
message.message=“Updated Time”+DateTime.Now.ToLongTimeString();
}
}));
}
最后
{
_timer.Start();
}
}
}
公共类CustomMessage:INotifyPropertyChanged
{
私人内部ID;
公共整数ID
{
获取{return\u ID;}
设置
{
_ID=值;
OnPropertyChanged(“ID”);
}
}
私有字符串消息;
公共字符串消息
{
获取{return\u Message;}
设置
{
_消息=值;
OnPropertyChanged(“消息”);
}
}
公共事件属性更改事件处理程序属性更改;
公共void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
using System;
using System.Windows;
using System.Timers;
using System.Collections.ObjectModel;
using System.Windows.Threading;
using System.ComponentModel;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Timer _timer = null;
        ObservableCollection<CustomMessage> _messages = null;

        int count = 0;

        public MainWindow()
        {
            InitializeComponent();
            _messages = new ObservableCollection<CustomMessage>();
            count++;
            _messages.Add(new CustomMessage() { ID = count, Message = "Message" });
            _timer = new Timer(1000);
            _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);

            this.DGNew.ItemsSource = _messages;
            _timer.Start();
        }

        void _timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                _timer.Stop();
                Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
                {
                    if (this.CBAdd.IsChecked == true)
                    {
                        count++;
                        _messages.Add(new CustomMessage() { ID = count, Message = "Timer Message " + count });
                    }
                    else
                    {
                        // Udpate existing Message
                        Random random = new Random();
                        CustomMessage message = _messages[random.Next(0, count)];
                        message.Message = "Updated Time" + DateTime.Now.ToLongTimeString();
                    }
                }));
            }
            finally
            {
                _timer.Start();
            }
        }
    }

    public class CustomMessage : INotifyPropertyChanged
    {
        private int _ID;

        public int ID
        {
            get { return _ID; }
            set
            {
                _ID = value;
                OnPropertyChanged("ID");
            }
        }

        private string _Message;

        public string Message
        {
            get { return _Message; }
            set
            {
                _Message = value;
                OnPropertyChanged("Message");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}