【问题标题】:WPF datagrid binded with list not updating与列表绑定的 WPF 数据网格未更新
【发布时间】: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


【解决方案1】:

我发现它不起作用的原因:我一直在重新创建可观察集合,这破坏了绑定。感谢您的帮助

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多