2009-10-07 2 views
0

관찰 가능한 작업 공간 모음에 바인딩 된 TDI가 있습니다 (모두 Josh Smith의 MVVM 데모를 기반으로 함). 하나의 탭에는 관찰 가능한 컬렉션에 바인딩 된 사용자 정의 컨트롤이 있습니다. 탭을 전환하면 사용자 컨트롤이 항상 첫 번째 항목으로 돌아갑니다.왜 ObservableCollection 바운드 컨트롤이 첫 번째 항목으로 점프합니까?

나는 좀 절망적이다. 나는 지금 5 시간 이후로 수색을했지만, 왜이 일을하는지, 어디서 검색해야 하는지를 알 수 없다.

나는 지금까지 내가 할 수있는 등의 모든 일을 단순화에 업로드 :

당신의 도움이 크게 감사합니다 (1,5MB에 대한) http://mad-scientists.co.uk/share/TestCandiMan.zip!

나는 C# 익스프레스 여기에 2008 년

+0

vin 디렉토리와 Subversion 디렉토리를 제거하면 zip을 조금 더 작게 만들 수 있습니다 :-) –

+0

죄송합니다. bin 디렉토리. –

+0

svn 및 bin dirs가없는 파일을 reuploaded, 조언을 위해 thx. 현재 약 900KB –

답변

1

문제가있는 TabControl이 너무보기가 모든 것을 기본값으로 설정하여 재 작성, 그 내용을 다른 탭의 항목을 선택할 때마다 새로운 DataTemplate을을 instantiaties이다 사용합니다. 주어진 뷰 모델에 대해 고유 한 뷰를 갖도록 메커니즘을 구현해야합니다. MVVM이 없다면 ViewModel에 View 속성을 추가하기 만하면됩니다.하지만 MVVM의 목적을 크게 벗어납니다.

귀하의 의견에 따라 편집하십시오 : 나는 탭을 전환 할 때마다 TabControl은 DataTemplate의 새로운 시각 트리를 사용하여 내용을 표시한다는 것을 의미합니다.

는 다음의 예제를 보자 :

  1. 당신은 탭 # 1을 선택, 그 내용은 CustomerViewModel이다. NewCustomerView의 새 비주얼 트리가 DataTemplate에서 만들어지고 TabControl에 표시됩니다. 첫 번째 텍스트 상자에 캐럿이 있고 탭에 첫 번째 인덱스가 선택되어 있습니다.

  2. 탭 # 2를 선택합니다. 탭 # 1의 콘텐츠는 시각적 트리에 더 이상 표시되지 않고 삭제됩니다. 탭 # 2의 내용은 1과 동일한 프로세스를 따라 트리를 작성합니다.

  3. # 1 탭을 다시 선택합니다. 탭 # 2의 콘텐츠는 시각적 트리에서 더 이상 존재하지 않으므로 삭제됩니다. 그리고 여기에서도 같은 메커니즘이 다시 활성화됩니다. DataTemplate에서 새로운 시각적 트리가 만들어지고 기본적으로 모든 것이 있습니다. 웁스! 그러나 WPF의 ContentPresenter는 한 번 내용이었던 가능한 모든 객체에 대해 내용의 트리를 메모리에 보관하지 않기 때문에 정상입니다.

=> 이론적 인 해결책은 자신을 시각적으로 구축하십시오. 예를 들어, 완전히 불완전한 세상에서 CustomViewModel에 고유 한 NewCustomerView를 만들고 속성을 통해이를 노출합니다 (예 :보기).

<DataTemplate DataType="{x:Type CustomerViewModel}"> 
    <ContentPresenter Content="{Binding View}" /> 
</DataTemplate> 

그리고 짜잔는 시각적 트리가 템플릿에서 생성 될 때, 발표자는 완전히 새로운 하나가 될 것입니다,하지만보기는 고유 및되지 않습니다 : 사용할 수 있습니다 새로운 DataTemplate을가 될 것입니다 캐럿은 사용자가 왼쪽으로 놓은 동일한 위치에있을 것이므로 탭에 대해 동일한 작업을 할 수 있습니다.

하지만 이전에 말했듯이 MVVM 철학에 전혀 문제가되지 않습니다. 지정된 ViewModel 또는 그와 비슷한 고유 한 View를 반환 할 수있는 정적 클래스를 작성하십시오.

또 다른 해결책은 SelectedTabIndex와 같은 것들을 ViewModel에 추가하고 바인딩하는 것, CurrentFocusPosition과 그것과 완전히 관련이 있습니다.

+0

hmmm ... 즉, 그 시나리오에서 동시에 표시하고 생성하기 위해 동일한 DataTemplate (예 : 고객 기본 데이터)을 사용할 수 없다는 의미입니까? 그게 너무 나쁘다. 중복을 의미하기 때문에 –

+0

빈 탭을 추가하는 함수를 추가했기 때문에 나는 오해했다고 생각한다. 기존 고객보기 및 데이터 템플리트와 관련이 없지만 고객 탭은 이전과 같이 1 번 항목으로 돌아갑니다. –

+0

내 의견을 다음과 같이 업데이트했습니다. –

관련 문제