简体   繁体   English

在WPF中使用计时器刷新数据网格后,如何保持我对数据网格行的选择

[英]How to keep my selection to the DataGrid Row after refresh the data grid using timer in WPF

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

Instead of using a List to store the data, try using an ObservableCollection . 与其使用List来存储数据, ObservableCollection尝试使用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. 使用ObservableCollection的好处是,每当您向集合中添加项目时,UI都会自动更新,因此不需要手动刷新DataGrid Below I have shared a sample application that adds and updates record in the DataGrid . 下面,我共享了一个示例应用程序,该应用程序添加和更新了DataGrid记录。

XAML: 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>

Code Behind: 背后的代码:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM