2010-06-12 4 views
1

ListBox 컨트롤에 2 개의 DataTemplate이 정의되어 있습니다. 1 템플릿은 UnSelected 상태 용이고 다른 하나는 Selected 상태 용입니다 (UnSelected 상태보다 자세한 내용 표시). DataTemplate 내의 요소에 액세스 ... 두 개 이상의 DataTemplate을 사용하는 방법?

은 여기 예제를 따라 : 뒤에 코드에서 DataTemplates 내부의 요소에 액세스하는 방법에 대한

http://blogs.msdn.com/b/wpfsdk/archive/2007/04/16/how-do-i-programmatically-interact-with-template-generated-elements-part-ii.aspx

합니다.

맞지만 UnSelected DataTemplate의 요소 만 찾아서 반환합니다. 하지만 Selected DataTemplate에서 요소를 검색 할 때 NullReferenceException이 발생합니다. 내가 잘못된 일을 할 수있는 무엇

?

답변

1

무엇을 잘못하고 있습니까?

나는 코드 백에서 DataTemplate 내부의 요소에 액세스하려고하면 무엇을하고있는 지 잘 모르겠다. . 장난 꾸러기, 장난 꾸러기!

코드를 사용하여 DataTemplate 내부의 요소에 액세스하려는 사람이 99.9 %라는 것을 보았습니다. 응용 프로그램이 잘못 설계되었거나 바인딩이없고보기 모델이 전혀 없기 때문입니다. 많은 초보자는 뷰 모델을 사용하는 대신 UI 요소에 직접 데이터를 저장하는 경향이 있습니다. 나는 그들의 생각이 VB, WinForms 및 ASP.NET 경험에 의해 손상 되었기 때문에 그것이 "정상적인"방법이라고 생각합니다. 뷰 모델을 사용하고 데이터를 UI 요소에 저장하는 대신 바인딩하는 데에는 천 가지 이유가 있습니다. 자세한 내용은 온라인에서 "모델 뷰 뷰 모델"을 찾아보십시오.

어떤 주어진 ListBoxItem의는 한 번에 하나의 DataTemplate을 가질 수

지금 귀하의 질문에 대답합니다. ContentPresenter에는 ContentTemplate 속성이 하나만 있고이 속성에는 두 가지 값이있을 수 없기 때문입니다.

이 때문에 ListBoxItem 아래의 시각적 트리는 여러 템플릿 조합이 아닌 특정 템플릿에서 항상 생성됩니다. ListBox의 ItemTemplate을 변경하거나 그렇지 않으면 ListBoxItem.ContentTemplate을 업데이트하면 이전 템플릿에서 생성 된 시각적 트리가 삭제되고 새 템플릿이 만들어집니다.

데이터 템플릿을 변경하면 이전 데이터 템플릿에서 생성 된 시각적 트리가 삭제되고 새로운 시각적 트리가으로 생성됩니다.

주어진 ListBoxItem에 대해 정의되고 사용 가능한 100 개의 데이터 템플릿을 가질 수 있지만 한 번에 하나씩 시각적 트리를 인스턴스화 할 수 있습니다. 그리고 이것들은 시각적 트리의 일부로 실제로 존재하는 유일한 요소입니다. 다른 모든 템플리트는 템플리트로만 존재하며 실제로 작성된 요소는 없습니다.

다른 방법 : 동일한 컨트롤에서 두 개의 다른 템플릿으로 인스턴스화 된 두 개의 다른 시각적 트리에서 요소를 찾는 방법에 대해 질문하는 것은 의미가 없습니다. 단일 컨트롤에 동시에 두 개의 다른 템플릿이 활성화 될 수 없기 때문입니다.

희망 사항에 따라 문제가 해결됩니다.

마지막 조언 : MVVM을 읽고 DataTemplates 최대한 빨리 요소에 액세스하는 것을 중단하십시오. 그러나 당신은 당신이 0에 있을지도 모른다라고 생각하면.실제로 템플릿 안의 요소에 액세스 할 수있는 유효한 이유가있는 1 %는 그렇게하고 싶어하는 실제 이유를 적어두고 추가 지침을 제공 할 수 있습니다.

+0

안녕하세요, 의견을 보내 주셔서 감사합니다. 그러나 나는 그것을 처리 할 수 ​​있었다. 그것은 ListBox_Selection 변경된 이벤트 처리기를 통해 액세스하려고했기 때문에 작업을하지 못했습니다. 그리고 어떤 이유에서 NULL obj를 FindVisualChild 메서드에 전달합니다. 이벤트 처리기에 코드를 옮겨서 사용해야하는데, "IsSyncronisedWithCurrentItem"을 True로 변경하면 효과가있었습니다. 그러나 귀하는 옳습니다. 저는 초보 개발자입니다. VB.NET을 시작으로 WPF를 우연히 발견하고 그것을 좋아했습니다. 아직도 나를 배우고 이해하는 것이 너무나 중요합니다. – GaaTY

+0

나는 당신이 어디에 있는지 알고 있습니다. 나는 WPF 초급자였습니다. 그걸로 고수하십시오 - WPF는 비교적 오랜 학습 곡선을 가지고 있습니다 만, 당신이 거기에있을 때 당신이 할 수있는 것은 단순히 놀랍습니다! –

2

키보드 포커스 설정은 데이터 템플릿 요소에 액세스해야하는 한 가지 이유 일 수 있습니다. MVVM은이 문제를 해결하지 못하고 FocusManager는 키보드 포커스를 설정하지 않습니다.