在WPF中使用计时器刷新数据网格后,如何保持我对DataGrid行的选择 [英] How to keep my selection to the DataGrid Row after refresh the data grid using timer in WPF
问题描述
我有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屋!