ASP.NET MVC C#observ列表并保留已删除和添加的项目

时间:2017-07-13 09:18:36

标签: c# asp.net-mvc observable

我有一个看起来像这样的课程:

private ObservableCollection<string> _areaCollection;
private List<string> _removedAreas;
private List<string> _addedAreas;

public Constructor()
{
    _areaCollection = new ObservableCollection<string>();
    _areaCollection.CollectionChanged += AreaCollectionChanged;
    _removedAreas = new List<string>();
    _addedAreas = new List<string>();
}

public IEnumerable<string> Areas { get { return _areaCollection; } }

public IEnumerable<string> AddedAreas
{
    get { return _addedAreas; }
}

public IEnumerable<string> RemovedAreas
{
    get { return _removedAreas; }
}

public void DisableArea(string areaAlias)
{
    if (_areaCollection.Contains(areaAlias))
        _areaCollection.Remove(areaAlias);
}

public void EnableArea(string areaAlias)
{
    if (!_areaCollection.Contains(areaAlias))
        _areaCollection.Add(areaAlias);
}

private void SectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{

    if (e.Action == NotifyCollectionChangedAction.Add)
    {
        var item = e.NewItems.Cast<string>().First();

        if (_addedAreas.Contains(item) == false)
        {
            _addedAreas.Add(item);
        }
    }
    else if (e.Action == NotifyCollectionChangedAction.Remove)
    {
        var item = e.OldItems.Cast<string>().First();

        if (_removedAreas.Contains(item) == false)
        {
            _removedAreas.Add(item);    
        }

    }
}

然后在我的控制器上更新actionresult我调用一个方法来更新属性:

 private bool UpdateProperties(IUser current, IUser update, out IUser result)
 {
    result = current;

    // Update areas
    ...

    return true;
 }

所以我想要以下结果:

  1. _areaCollection结果包含更新后的列表
  2. _removedAreas包含根据更新
  3. 删除的区域
  4. _addedAreas包含根据更新添加的区域
  5. 但我坚持这个。

1 个答案:

答案 0 :(得分:1)

我相信你正以错误的方式接近你的问题。根据我的理解你想要的是知道两个集合之间的差异。为此,您根本不需要ObservableCollection,只需要过滤删除哪些元素以及添加哪些元素。

假设currentupdated都包含名为Areas的读/写属性:

var updatedSet = new HashSet<string>(updated.Areas);
var currentSet = new HashSet<string>(current.Areas);

var added = updatedSet.Where(a => !currentSet.Contains(a));
var removed = currentSet.Where(a => !updatedSet.Contains(a));
current.Areas = updated.Areas;

如果您确实需要将Areas属性设为只读,则可以使用以下代码更改最后一行:

foreach(var item in added)
    current.EnableArea(item);
foreach(var item in removed)
    current.DisableArea(item);

这实在是效率低下。