2012-09-20 1 views
1

아래 메서드를 사용하여 TreeViewItem을 복제하려고 시도했지만 XamlWriter.Save()에 도달하면 StackOverflowException이 발생합니다.StackOverflowException 사용자 정의 컨트롤을 복제하려고 할 때 XamlWriter.Save()를 사용할 때

이이 트리거 코드 : ViewTree 내 트 리뷰의 이름입니다

var b = Clone<TreeViewItem>(ViewTree.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem); 

.

public static T Clone<T>(T from) { 
    string objStr = System.Windows.Markup.XamlWriter.Save(from); 
    System.IO.StringReader stringReader = new System.IO.StringReader(objStr); 
    System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(stringReader); 
    object clone = System.Windows.Markup.XamlReader.Load(xmlReader); 

    return (T)clone; 
} 

답변

2

이 트리 뷰에주기가 있는지 확인하십시오. 예 : 일부 treeview 노드 (또는 자식 하위 노드)에는 부모 노드를 가리키는 하위 노드가 있습니다. StackOverflowException은 일반적으로 메모리가 부족한 재귀를위한 것입니다.

+0

필자의 경우 데이터 바인딩 된 뷰 모델의 각 하위 항목에는 부모 컬렉션 뷰 모델에 대한 참조가 있습니다. 그게 문제 야? XamlWriter.Save에게 이것을 처리하도록 어떻게 가르 칠 수 있습니까? – ygoe

+0

어쩌면 자식이없는'ParentReferenceTreeViewItem'과 같은 특수 노드를 만들 수 있습니다. 원하는 노드 만 가리키는 속성이 있어야합니다. 문제는 자식 노드에 부모 노드의 인스턴스가있는 경우 루프가 만들어지는 것입니다. –

2

이 나를 위해 작동합니다

System.Xaml.XamlServices.Save(obj); 

System.Xaml.dll

에서 제대로 순환 참조를 처리합니다.