2015-10-15 74 views
2

我在尝试从Children Collection中移除一个元素时有一种奇怪的行为。正如你第一次看到remove方法被执行的时候count是8(没有改变),但是如果我进入remove方法,元素被移除。对observablecollection的Stange移除行为

这是怎么回事? (希望包含在图像中的代码足以得到关于它的线索,如果不是,请询问更多细节)

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

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; } 
} 

enter image description here

+0

请考虑添加[tag:visual-studio]标签,因为这个问题可能是特定于Visual Studio的。 –

+0

Offtopic,不知道我会不喜欢这么多看到删除内循环col.Count评估:)顺便说一句,你显示的列数是在项目被删除后,你确定这不是你正在检查下一个迭代? – Icepickle

+0

@Ippickle我相信因为我强制调试器回去执行remove方法。对不起,我应该把计数保存在一个变量中。 –

回答

1

而且问题很简单...我对我的递增i两次在remove方法循环。

0

所以你而不是从原来的集合中移除从复制的项目您的孩子属性返回集合的副本。

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

更改代码

get { return Children; } 
+0

感谢您的建议,但是: 1st。这不起作用,因为类型不同。 2nd。我只是试图在界面上返回一个IEnumerable,并且也没有工作。 –

+0

它正确的原因,它不工作,现在我们只需要适合你的工作 – MikeT

+0

不客气。您可能需要阅读关于协变/逆变的内容,以了解为什么此设计(操纵集合中的Collection )是一个坏主意。 – Guillaume

相关问题