WPF数据网格绑定列表不更新

时间:2017-06-22 17:31:17

标签: c# wpf binding datagrid observablecollection

我有一个通过

绑定到列表的数据网格
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));被击中并且它不是空的但没有相同的发生

1 个答案:

答案 0 :(得分:1)

我发现它无法正常工作的原因:我一直在重新创建可观察的集合,这就是破坏了绑定。谢谢你的帮助