在WPF中使用计时器刷新数据网格后,如何保持我对DataGrid行的选择 [英] How to keep my selection to the DataGrid Row after refresh the data grid using timer in WPF

查看:121
本文介绍了在WPF中使用计时器刷新数据网格后,如何保持我对DataGrid行的选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有WPF DataGrid,并且正在绑定DataGrid,但是如果对Data进行了任何更改,它将自动刷新,但是我对datagrid行的选择将被取消。

I have WPF DataGrid and i am binding the DataGrid but if any changes made into the Data it will automatically refresh but my selection to the datagrid row will unselected.

推荐答案

而不是使用 List 来存储数据,请尝试使用 ObservableCollection 。使用 ObservableCollection 的优点是,每当您向集合中添加项目时,UI都会自动更新,因此可以手动刷新 DataGrid 不是必需的。下面,我共享了一个示例应用程序,该应用程序在 DataGrid 中添加和更新记录。

Instead of using a List to store the data, try using an ObservableCollection. The advantage of using the ObservableCollection is that whenever you add an item to the collection the UI get automatically updated so a manually refresh of the DataGrid is not required. Below I have shared a sample application that adds and updates record in the DataGrid.

XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal">
        <RadioButton Name="CBAdd" GroupName="AddOrEdit" Content="Add Messages" IsChecked="True"></RadioButton>
        <RadioButton Name="CBUpdate" GroupName="AddOrEdit" Content="Update Messages"></RadioButton>
    </StackPanel>
    <DataGrid Grid.Row="1" Name="DGNew" CanUserAddRows="False">

    </DataGrid>
</Grid>

后面的代码:

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

这篇关于在WPF中使用计时器刷新数据网格后,如何保持我对DataGrid行的选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆