我有一个带有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中显示。
答案 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
的一个实例,然后只更改其项目。我的意思是Add
,Remove
和Clear
方法。