2013-08-12 3 views
1

나는 tabcontrol의 깊은 복사본을 만들어야합니다.TabControl 딥 복사

큰 그림은 다음과 같습니다. 저는 300 줄의 XAML 코드 TabControl과 함께 8 개의 탭이있는 프로젝트가 있습니다. 나 또한 다른 항목 TreeView 있습니다.

해당 목록의 항목을 선택하면 해당 목록과 연결된 TabControl이 표시됩니다. 문제는 이제 요소를 추가 할 때 원본 TabControl의 전체 복사본을 만들어 새 요소를 새 요소에 연결하려는 것입니다. 물론 새 요소에서 내용을 지울 것입니다. 얕은 복사본은 메모리의 동일한 위치를 가리키기 때문에 작동하지 않으므로 "=", IClonable은 이동하지 않습니다. 그리고 좌절하는 부분은 TabControl이 직렬화 가능하지 않기 때문에 직렬 복사로 전체 복사본을 사용할 수 없다는 것입니다. 그리고 TabControl은 XAML에서 300 줄이고 코드에서 600 줄이므로 공간과 시간이 낭비되므로 직렬화 할 수있는 사용자 지정 TabControl을 만들 수 없다는 것입니다.

나는 이것을 2 일 동안 검색했지만 아무 것도 찾지 못했습니다. 모든 유형의 TabControl을 복사 할 수있는 일반 용도의 딥 복사 (Deep Copy) 메서드를 찾고 있기 때문에 코드를 표시 할 필요가 없습니다.

+0

정말 "공간"300 줄의 코드가 얼마나 많이 차지하는지 걱정하지 않아도됩니다. 응용 프로그램의 크기와 크게 다르지 않습니다. 또한, 귀하의 질문에 서식을 추가하십시오 .. 예를 들어, 새로운 단락 두 개의 "엔터"프레스 (캐리지 리턴)이 필요합니다 – Sayse

+0

'Object.MemberwiseClone'을 사용하는 방법에 대해? [MSDN] (http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx)에는이 기능을 사용하여 얕은 복사본과 전체 복사본 (딥 복사본 기본적으로 객체에 대한 MemberwiseClone을 수행 한 다음 중첩 된 참조 유형의 복제 된 객체에 새 인스턴스를 만듭니다. – Tim

+0

Tim 나는 이것을 시도한 것 같아요. (여기서 물어보기 전에 10 가지 방법을 시도했지만) 다시 시도 할 것입니다. –

답변

0

좀 더 검색 한 후에 처음에는 다른 방법을 시도했지만 가치가있는 것보다 더 많은 문제가 있음이 드러났습니다 (데이터 바인딩을 시도하고 코드가 더 많지만 여전히 많은 작업을했습니다).

그래서 해결 방법은 XamlReader 및 XamlWriter를 사용하는 것입니다. 공식 문서는 here이고 각각 ​​here! 당신이 여기 XAML이있는 TabControl했다 말 :

<TabControl> 
    <TabItem><!--A lot of stuff here--></TabItem> 
    <TabItem><!--More stuff here--></TabItem> 
</TabControl> 

을 그리고 이것은 당신이 물건을 많이 가지고있는 경우 (기본적으로 내가 이것을 언급하지 않았다 기억

는 것 코드에서 내 질문에 대답하려면 하지만 꽤 복잡한 XML을 생성하는 인터페이스를 만들고 있습니다. 그래서 TabControl에서는 많은 사용자 생성 데이터를 처리하고 있습니다!) 간단한 TabControl을 사용하는 경우 코드에서 사용자 정의 컨트롤을 만들거나 단순히 DataBindings를 사용하십시오.

string savedTabControl = XamlWriter.Save(originalTabControl); 

StringReader stringReader = new StringReader(savedTabControl); 
XmlReader xmlReader = XmlReader.Create(stringReader); 
TabControl newTabControl = (TabControl)XamlReader.Load(xmlReader); 

그래서이 기본적으로 XAML 컨트롤과되지 않은 데이터에 만들어진 직렬화입니다 :

은 그래서 XAML의 깊은 복사를 만들기위한 백그라운드에서 코드가있는 TabControl이 될 것입니다 정의.

0

모두 잘못하고 있습니다.

UI is Not Data 때문에 UI 등을 "복사"하지 않아도됩니다. UI 요소 대신 데이터 항목을 조작하고 복사해야하며 DataTemplate을 사용하여 데이터 항목을 화면에 표시해야합니다.

WPVM에서 한 줄의 코드를 작성하기 전에 MVVM을 연구하고 배우는 것이 좋습니다.

+1

정말 고마워요. 시작 했으므로 제안한 모델보기보기 모델을 조사 할 것입니다. 나는 새로운 것을 배울 때 지름길을 사용하지 않을 것입니다. –