使用可观察集合

时间:2015-07-16 11:58:46

标签: wpf binding observablecollection

我有一个带有Observable Collection属性的ViewModel

 public ObservableCollection<GeographicArea> CurrentSensorAreasList
 {
     get
     {
        return currentSensorAreasList;
     }
     set
     {
        if (currentSensorAreasList != value)
        {
            currentSensorAreasList = value;
            OnPropertyChanged(PROPERTY_NAME_CURRENT_SENSOR_AREAS_LIST);
         }
      }
  }

然后在我的xaml中我有一个绑定

  

ItemsSource =“{Binding CurrentSensorAreasList}”&gt;

这个Observable Collection更新了一个可以在viewModel构造函数中调用的方法,或者当调用另一个列表中的collectionchanged处理程序时。

我只清除列表,然后添加更少的新项目。在调试时,我看到列表中的所有新项目都已更新。但是UI没有得到更新。 当我重新生成viewModel然后这个更新方法在构造函数中调用时,列表会在UI中更新。

任何想法?我不知道当我从处理程序调用该方法时是否出现问题.....

更新#1

根据要求,我在更新列表时会输入代码 我已经测试了两种方法来进行此更新

    private void UpdateList1()
        {
            if (globalAreaManagerList != null && OperationEntity != null) 
            {

              CurrentSensorAreasList.Clear();                         
              CurrentSensorAreasList.AddRange(globalAreaManagerList.Where(x => x != (OperationEntity as AreaManager)).SelectMany(areaRenderer => areaRenderer.AreaList));    

// AddRange是一种扩展方法。

            }
        }
private void UpdateList2()
        {
            if (globalAreaManagerList != null && OperationEntity != null) 
            {
                CurrentSensorAreasList = new ObservableCollection<GeographicArea>(globalAreaManagerList.Where(x => x != (OperationEntity as AreaManager)).SelectMany(areaRenderer => areaRenderer.AreaList))


            }
        }

当我从构造函数中调用它时,这两种情况都有效。然后我有其他区域,其中区域更改,我通过CollectionChanged处理程序得到通知。

private void globalAreaManagerList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {

            if (e.NewItems != null)
            {
                foreach (AreaManager newItem in e.NewItems)
                {
                    newItem.AreaList.CollectionChanged += AreaList_CollectionChanged;
                }
            }
            if (e.OldItems != null)
            {
                foreach (AreaManager oldItem in e.OldItems)
                {
                    oldItem.AreaList.CollectionChanged -= AreaList_CollectionChanged;
                }
            }
            UpdateList();
        }
        private void AreaList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            UpdateList();
        }

因此,当我使用UpdateList1似乎工作更多次但突然Binding被破坏,然后此更新不会在UI中显示。

1 个答案:

答案 0 :(得分:0)

如果您希望更改集合的实例,我建议使用DependecyProperty来支持该案例。

这是:

    public ObservableCollection<GeographicArea> CurrentSensorAreasList
    {
        get { return (ObservableCollection<GeographicArea>)GetValue(CurrentSensorAreasListProperty); }
        set { SetValue(CurrentSensorAreasListProperty, value); }
    }

    public static readonly DependencyProperty CurrentSensorAreasListProperty =
        DependencyProperty.Register("CurrentSensorAreasList", typeof(ObservableCollection<GeographicArea>), typeof(ownerclass));

其中ownerclass - 您放置此属性的类的名称。

但更好的方法是只创建ObservaleCollection的一个实例,然后只更改其项目。我的意思是AddRemoveClear方法。