动态分配时,可观察集合刷新不起作用

本文关键字:集合 刷新 不起作用 观察 动态分配 | 更新日期: 2023-09-27 18:34:25

public ObservableCollection<Model.ChildCommand> ChildCommands { get; private set; }

ChildCommands 绑定到数据网格。

两个段都向我显示数据网格中的项目。

但在第一段中,当集合更改时,Datagrid 项不会自动刷新。对于第二段,刷新有效。

第 1 部分:

var childs = from child in m_context.ChildCommand.Local
                         select child;

this.ChildCommands = new ObservableCollection<Model.ChildCommand>(childs);

第 2 部分:

this.ChildCommands = m_context.ChildCommand.Local;

如何使用第一段获得自动刷新?

动态分配时,可观察集合刷新不起作用

段 1 不自动更新的原因是您最终绑定到不同的 ObservableCollection 实例。

当m_context。ChildCommand.Local 更改时,您的段 2 数据网格会收到通知,因为它绑定到该可观察的集合实例。但是,您的段 1 数据网格绑定到不同的可观察集合实例(当您说新的可观察集合(子)时,您自己创建了该实例。

如果你真的希望他们两个都绑定到m_context。ChildCommand.Local 可观察集合,则应这样实现它,而不是为段 1 创建不同的可观察集合实例。

您需要

ChildCommands 属性实现INotifyPropertyChanged,如下所示:

public class YourClass: INotifyPropertyChanged
  {
      private ObservableCollection<Model.ChildCommand> _childCommands;
      public event PropertyChangedEventHandler PropertyChanged;
      public ObservableCollection<Model.ChildCommand> ChildCommands
      {
          get { return _childCommands; }
          set
          {
              _childCommands= value;
              OnPropertyChanged("ChildCommands");
          }
      }
      protected void OnPropertyChanged(string name)
      {
          PropertyChangedEventHandler handler = PropertyChanged;
          if (handler != null)
          {
              handler(this, new PropertyChangedEventArgs(name));
          }
      }
  }

有关详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/ms743695%28v=vs.110%29.aspx

我的解决方案是从 NotificationObject 类继承我的类。

之后,只需使用

this.ChildCommands = m_context.ChildCommand.Local;
RaisePropertyChanged(() => this.ChildCommands); //this line notifies the UI that the underlying property has changed.

如果集合被重新实例化,则不会更新与集合的绑定。您有两种选择:

  1. 在 ChildCommands 属性上实现 INotifyPropertyChanged
  2. 而不是做:

    这。ChildCommands = new ObservableCollection(childs);

请改为执行以下操作:

this.ChildCommands.Clear();
foreach(var child in childs)
   this.ChildCommands.Add(child);