2010-06-08 4 views
1

항목 사이에 구분 기호가있는 ItemsControl을 만들려고합니다 (예 : 탐색 빵 부스러기를 만드는 컨트롤). 컨트롤이 완전히 일반화되기를 바랍니다.Items instantiatePanelTemplate

내 원래 메서드는 ItemsControl을 확장하고 SeparatorTemplate 속성을 추가 한 다음 클래스를 ItemsControl의 ItemsHost에 추가하도록했습니다. 이 접근 방식의 문제점은 컨테이너 패널에 추가 항목을 추가하면 ItemGenerator가 혼란스럽고 항목이 잘못되어 올바르게 제거되지 않는다는 것입니다.

그래서 내 두 번째 계획은 ItemsControl을 에뮬레이트 할 완전히 새로운 컨트롤을 만드는 것이지만 실행중인 문제는 ItemsPanelTemplate을 인스턴스화하는 방법을 찾을 수 없다는 것입니다. ItemsControl과 같은 ItemsPanel 속성을 제공하고 싶습니다. 그런 다음 해당 템플릿에서 패널을 만들 수 없습니다.

누구나 ItemsPanelTemplate을 인스턴스화하거나 ItemsControl의 패널에 컨트롤을 추가하는 방법을 ItemGenerator를 깨지 않고 생각할 수 있습니까?

답변

0

글쎄, 직접 해보지는 않았지만 GetContainerForItemOverride을 덮어 쓰면이 문제를 해결할 수 있다고 생각했을 것입니다.

당신은 기본 템플릿이 Grid 또는 StackPanel A의 분리와 같은 기본 모든으로 사용하려는 어떤 전형적인 ContentPresenter와에있는 템플릿 ContentControl 인 새로운 BreadCrumbItem 컨트롤을 만들 수 있습니다.

GetContainerForItemOverrideBreadCrumbItem의 새로운 인스턴스가 ItemsControl 파생에서 ItemTemplate 속성의 ContentTemplate를 설정 생성합니다 (BreadCrumb 제어?).

BreadCrumb 컨트롤은 GetContainerForItemOverride 중에 생성하는 BreadCrumbItem에 할당 한 BreadCrumbItemStyle 속성도 표시합니다.

BreadCrumb 컨트롤에 다른 *Container*Override 메서드를 구현해야 할 수도 있습니다.

+0

필자는 ItemContainer에 구분 기호를 포함하지 않아도되도록 노력하고있었습니다. 기본 템플릿에 포함 시키면 마지막 항목이 무엇인지 관리해야하므로 마지막 항목에 구분 기호가 표시되지 않도록 할 수 있습니다. ItemContainer에 포함시키는 다른 문제는 ItemsPanel의 레이아웃을 따르지 않는다는 것입니다. 나는 ItemsPanel을 제공 할 수 있고 다른 Items 인 것처럼 정확하게 레이아웃 할 수 있기를 원합니다. – Stephan

+0

@ 스탄 : 좋은 지적. "LastItem"시각적 상태를 포함하면 "관리"가 솔루션에 관계없이 불가피한 추가 구분 기호로 도움이 될 수 있습니다. 방향에 관해서는 디자이너가 기본 패널을 대체하는 것으로 선택되면 'BreadCrumbItemStyle' 속성을 통해'BreadCrumbItem' 템플릿을 대체해야합니다. 개인적으로 나는 이것이 합리적인 장소라고 생각합니다. 컨트롤은 상자 밖에서 받아 들여지는 작업을 수행하며, 소비자가 원하는 경우 인식을 넘어선 스타일을 지정할 수 있습니다. – AnthonyWJones

+0

그럼 ItemsSource를 오버로드하고 목록에 구분 기호를 삽입하여 실제 ItemsSource에 밀어 넣기로했습니다. 누군가가'base.ItemsSource' 자체에 접근 할 수 있기 때문에 그것이 가장 안전한 방법이 아닐지도 모른다는 것을 압니다. 그러나 그것은 제가 찾고있는 것을 나에게주었습니다. 당신의 도움을 주셔서 감사합니다. – Stephan