【发布时间】:2017-11-26 02:51:27
【问题描述】:
我有一个数据网格通过
绑定到列表public List<IHWModbusTcpTableItem> HoldingRegisters { get; set; }
然后
m_dtgHoldRegs.ItemsSource = m_Table.HoldingRegisters;
要更新数据网格,我重做上面的行。但是时间长了就会产生内存泄漏等问题。
因此我认为最好只设置一次源然后更新。
所以我做的第一件事就是将列表更改为可观察的集合:
public ObservableCollection<IHWModbusTcpTableItem> HoldingRegisters { get; set; }
然后只设置一次项目来源。其他时间只更新:
m_dtgHoldRegs.UpdateLayout();
m_dtgHoldRegs.Items.Refresh();
不幸的是,这没有用。
好的,根据我的建议,我添加了这个:
public class CTableModbusItem : IHWModbusTcpTableItem, INotifyPropertyChanged
{
public CTableModbusItem(string label, ushort addr, short regValue)
{
Label = label;
Address = addr;
RegValue_Decimal = regValue;
}
public string Label { get; set; }
public ushort Address { get; set; }
public void UpdateTable()
{
NotifyPropertyChanged("RegValue_Decimal");
}
private int _regValue_Decimal;
public int RegValue_Decimal
{
get { return _regValue_Decimal; }
set
{
_regValue_Decimal = value;
RegValue_Binary = Convert.ToString(value, 2).PadLeft(8, '0');//8bit
RegValue_Hex = Convert.ToString(value, 8);
if (value > 32)
RegValue_Ascii = Convert.ToChar(value);
}
}
public string RegValue_Binary { get; set; }
public string RegValue_Hex { get; set; }
public char RegValue_Ascii { get; set; }
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
当我想更新时,我会在计时器上进行:
for (int iii = 0; iii < m_Table.HoldingRegisters.Count(); iii++)
m_Table.HoldingRegisters[iii].UpdateTable();
所以现在我看到了 this.PropertyChanged(this, new PropertyChangedEventArgs(propName));被击中并且它不为空但没有发生相同的事情
【问题讨论】:
-
通常单独 ObservableCollection 就足够了,没有 UpdateLayout 和 Items.Refresh
-
ObservableCollections - “表示动态数据集合,在添加、删除或刷新整个列表时提供通知。”这意味着如果您要更改集合的内容,它不会引发集合已更新的事件。
-
您是否尝试过实现 INotifyPropertyChanged 接口并将您的
HoldingRegistersproperty 更改为带有支持字段和上升PropertyChanged的属性?更新列表时无需设置ItemsSource。
标签: c# wpf binding datagrid observablecollection