【问题标题】:ASP.NET MVC C# observ list and hold removed and added itemsASP.NET MVC C# 观察列表并保留已删除和添加的项目
【发布时间】:2017-07-13 09:18:35
【问题描述】:

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

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. _addedAreas 包含根据更新添加的区域

但我坚持这一点。

【问题讨论】:

  • 如果一切都是私有的,ObservableCollection 的目的是什么?为什么不将逻辑封装在禁用/启用方法中?此外,真的很难理解你想要达到的目标,这个问题根本不清楚。什么不工作?
  • 忘记了删除和添加区域的 2 个公共获取属性。我想保留已删除和添加的区域,以便轻松更新数据库。所以首先我通过查看 RemovedAreas 属性来删除这些区域,然后通过查看 AdditionalAreas 属性进行插入。
  • 我的问题仍然存在,为什么不直接使用List 而不是ObservableCollection,并将_addedAreas.Add(item);_removedAreas.Add(item); 放入EnableArea/DisableArea 方法中?这将简化您的课程。
  • 好的,但是接下来如何同步我的 areaCollection 的 2 个对象并获得我想要的结果?

标签: c# asp.net-mvc observable


【解决方案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);

这确实是低效的。

【讨论】:

  • 我也使用这些方法只编辑区域而不是更新整个对象。但也许需要考虑一下。
  • 感谢您的帮助,我创建了一个 UpdateArea() 方法,我在其中施展魔法并删除了其他 2 个方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多