gpt4 book ai didi

c# - 降低绑定(bind)DataGrid的刷新率

转载 作者:行者123 更新时间:2023-11-30 17:20:00 25 4
gpt4 key购买 nike

我的 WPF/C# 应用程序中有一个绑定(bind)到 Entity Framework 集合的 DataGrid。每行都有变化非常频繁的绑定(bind)列 - 每秒多次。这导致该列基本上不可读,因为它经常更改。如何强制 WPF 每 .5 秒或 1 秒仅显示一个新值,即使该值每 .1 秒更改一次?

例如

dataGrid.MaxRefreshRate = 1000; (value in milliseconds).

最佳答案

我认为您需要在数据和数据网格之间创建一个层。

假设您的数据是 List 类型,并且目前它绑定(bind)到您的 DataGrid。

我们需要为您的数据提供一些包装类(在本例中为一行)。这个包装器延迟属性更改并定期触发它。注意:我在没有任何测试的情况下用心写了这段代码,可能(并且将会)存在错误。它也不是线程安全的,您需要在使用列表时添加一些锁。但要击中重点。

public class LazyRecord : INotifyPropertyChanged
{
private string name;
public string Name
{
get { return name; }
set
{
if (name != value)
{
name = value;
OnPropertyChanged("Name");
}
}

// other properties

// now the important stuff - deffering the update
public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(string propertyName)
{
if (this.changedProperties.Find(propertyName) == null)
this.changedProperties.Add(propertyName);
}

private readonly List<string> changedProperties = new List<string>();

// and the timer that refreshes the data
private readonly Timer timer;
private readonly Record record;

public LazyRecord(Record record)
{
this.timer = new Timer(1000, OnTimer);
this.record = record;

this.record.OnPropertyChanged += (o, a) => this.OnPropertyChanged(a.PropertyName);
}

public void OnTimer(..some unused args...)
{
if (this.PropertyChanged != null)
{
foreach(string propNAme in changedProperties)
{
PropertyChanged(new PropertyChangedEventArgs(propName));
}
}
}

在此之后,只需从您的 List< Record > 创建一个 List< LazyRecord > 并将其用作您的数据源。显然,使用通用解决方案很简单,它的可重用性要高得多。希望我有所帮助。

关于c# - 降低绑定(bind)DataGrid的刷新率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4448916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com