【问题标题】:Stange removing behavior on observablecollection在 observablecollection 上移除 Stange 行为
【发布时间】:2015-10-15 09:55:31
【问题描述】:

我在尝试从 Children Collection 中删除元素时遇到了奇怪的行为。如您所见,第一次执行 remove 方法时,计数为 8(未更改),但如果我进入 remove 方法,元素将被删除。

发生了什么事? (希望图片中包含的代码足以了解它,如果没有,请询​​问更多详细信息)

编辑:我已经根据答案中给出的建议稍微更改了界面,但问题仍然存在。这也会导致实现上的一些变化(注意图像上的红色罢工,对绘画技巧感到抱歉)。

public interface ITreeContentItem
{
    string Name { get; set; }
    int Id { get; set; }
    int Level { get; }
    ITreeContentItem Parent { get; set; }
    IEnumerable<ITreeContentItem> Children { get; }
    bool ChangeParent(ITreeContentItem parent);
    Thickness Border { get; }
}

【问题讨论】:

  • 请考虑添加visual-studio 标记,因为此问题可能特定于 Visual Studio。
  • Offtopic,不知道我不喜欢在评估 col.Count 的 for 循环中看到删除:) 顺便说一句,您显示的 col Count 是在删除项目之后,是你确定这不是你要检查的下一次迭代吗?
  • @Icepickle 我确定是因为我强制调试器返回执行删除方法。抱歉,我应该将计数保存在变量 1st 上。
  • 能否提供ITreeContentItem代码?
  • 具体我们需要知道接口和对象中的子类型是什么

标签: c# .net wpf visual-studio


【解决方案1】:

问题很简单...我在 remove 方法的 for 循环中将 i 增加了两次。

【讨论】:

    【解决方案2】:

    您的 Children 属性返回集合的副本,因此您从副本而不是原始集合中删除项目。

    更改您的代码

    get { return new ObservableCollection<ITreeContentItem>(Children); }
    

    get { return Children; }
    

    【讨论】:

    • 感谢您的建议,但是:第一。这不起作用,因为类型不同。第二。我只是尝试在界面上返回一个 IEnumerable 并没有工作。
    • 这是它不工作的正确原因,现在我们只需要为你工作的工作
    • 不客气。您可能想了解协变/逆变,以了解为什么这种设计(通过 Collection 操作 Collection)是一个坏主意。
    • @Guillaume 是的,在界面上返回 ObservableCollection 的决定是一个糟糕的决定。我更改为 IEnumerable,现在我可以毫无顾虑地只返回 Children。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    相关资源
    最近更新 更多