我有一个通过
绑定到列表的数据网格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(这个,新的PropertyChangedEventArgs(propName));被击中并且它不是空的但没有相同的发生
答案 0 :(得分:1)
我发现它无法正常工作的原因:我一直在重新创建可观察的集合,这就是破坏了绑定。谢谢你的帮助