2015-10-15 30 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

相關問題