DataGrid C#的实时更新
Posted
技术标签:
【中文标题】DataGrid C#的实时更新【英文标题】:Realtime update of DataGrid C# 【发布时间】:2022-01-15 16:30:01 【问题描述】:我正在创建一个 UI 以可视化模拟器的某些部分。我应该以表格格式呈现一些值,但是当表格已经初始化时,我无法让表格持续更新(它使用正确的值初始化,但是当你查看它时它是静态的,所以你必须转到另一个页面然后返回以更新表格) 这是代码:
<Page x:Class="SimulatorUI.RawDataPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SimulatorUI"
mc:Ignorable="d"
d:DesignHeight="950" d:DesignWidth="750"
Title="RawDataPage">
<DataGrid Name="dataTable" MinWidth="500" Margin="10 10 10 10" HorizontalContentAlignment="Center" HorizontalAlignment="Center"/>
</Page>
而c#代码是这样的
public partial class RawDataPage : Page
List<TankModule> tankList;
public RawDataPage(List<TankModule> list)
tankList = list;
InitializeComponent();
List<displayModule> data = loadTable();
dataTable.ItemsSource = data;
Task.Run(() => updateLoop());
public List<displayModule> loadTable()
List<displayModule> modules = new List<displayModule>();
foreach(TankModule tank in tankList)
modules.Add(new displayModule(tank));
return modules;
internal async Task updateLoop()
for (; ; )
dataTable.ItemsSource = null;
dataTable.ItemsSource = loadTable();
await Task.Delay(1000);
【问题讨论】:
我认为您应该尝试将 DataTable 的 ItemsSource 属性绑定到 ObservableCollection数据绑定在这些情况下效果最好。
将 tankList 从 List 更改为 ObservableCollection 开始,然后将 DataGrid 绑定到 坦克列表。现在,每当您在 tankList 中添加或删除新项目时,DataGrid 都会更新以反映更改。
代码隐藏应该是这样的:
// Add this using to use ObservableCollection
using System.Collections.ObjectModel;
public partial class RawDataPage : Page
// I've renamed tankList to TankList, as it is a convention to name public properties in Pascal case
public ObservableCollection<TankModule> TankList get; set;
public RawDataPage(List<TankModule> list)
DataContext = this; // This will bind this instance as the data context of the view
tankList = new ObservableCollection<TankModule>(list);
在视图中:
<Page x:Class="SimulatorUI.RawDataPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SimulatorUI"
mc:Ignorable="d"
d:DesignHeight="950" d:DesignWidth="750"
Title="RawDataPage">
<DataGrid Name="dataTable" ItemsSource="Binding TankList" MinWidth="500" Margin="10 10 10 10" HorizontalContentAlignment="Center" HorizontalAlignment="Center"/>
</Page>
注意:如果您修改 TankList 中的项目,视图可能不会更新。在这种情况下,TankModule 类必须实现 INotifyPropertyChanged。 你也可以在修改列表项后做这样的事情来刷新列表:
ObservableCollection<TankModule> copy = TankList;
TankList = null;
TankList = copy;
另外,建议使用视图模型而不是在代码隐藏中执行所有这些操作。
【讨论】:
以上是关于DataGrid C#的实时更新的主要内容,如果未能解决你的问题,请参考以下文章
C#的wpf工程中由于datagrid中的数据一直在更新所以每次选中某一行时,数据一更新选中就会被取消掉