2014-02-14 5 views
0

내 문제는 다음과 같습니다. 동적 범주가있는 트리가 있습니다 (각 카테고리는 하위 카테고리와 항목을 가질 수 있습니다).HierarchicalDataTemplate - 생성시 특정 유형 무시

이제 TreeView에 범주가 올바르게 표시되도록 HierarchicalDataTemplate을 추가했습니다. 하지만 템플릿 (잘못된 유형)을 적용하지 않고 '시체'로 트리에 표시되는 빈 항목이 많습니다.

어떻게 생성 프로세스에서 금지 할 수 있습니까? 이것은 추상적 인 트리이기 때문에 범주와 동일한 기본 클래스를 사용합니다. 트리가 항상 범주, 항목 또는 둘 다를 포함하는 "분기"속성을 검색하기 때문에 트리에 들어갑니다.

아이디어가 있으십니까? 나는 TreeView의 어떤 사건도 발견하지 못했을 것이다. 아마도 TreeView를 생성하는 동안 다양한 항목을 건너 뛰거나 템플리트의 옵션/특성을 무시할 기회를 제공 할 것이다.

자세한 설명 : 일반 Tree 클래스가 있습니다. 이 클래스는 "A_TreeLeaf"(abstract) 유형의 분기를가집니다. 트리의 제네릭 형식은 물론 A_TreeLeaf를 상속해야합니다. 내 데이터는 범주 (CategoryTreeLeaf) 및 데이터 (DataTreeLeaf)로 구성됩니다. 물론 각 리프에는 하위 엽 (가지)가있을 수 있습니다.

이제 데이터베이스에서 데이터를로드하고 트리를 작성합니다. 각 카테고리에는 X 하위 카테고리가 있습니다. 또한 각 카테고리에는 일부 데이터가 포함될 수 있습니다. 이 구조는 카테고리와 데이터의 명확한 계층 적 구조를 가지고 있기 때문에 많은 도움이됩니다. 이렇게하면 사용자에게 시각화해야합니다. 하지만 데이터와 카테고리를 구분하고 싶습니다. TreeView는 HierarchicalDataTemplate에 의한 카테고리 만 표시하고 ListView는 DataTemplate에 의한 Data 만 표시합니다. ListView 제대로 작동하지만 Tree "DataTreeLeaf 인스턴스 인" "시체"- 항목을 보여줍니다.

생성시 DataTreeLeafs를 필터링하거나 TreeView를 표시하지 않도록하고 싶습니다. "해킹되지 않은"솔루션이 있습니까? 정말 필요하지 않으면 트리를 복사하고 데이터 잎을 제거하고 싶지 않습니다. 왜냐하면 이렇게하면 많은 비용이 들기 때문에 실제 트리 나 시각화를 사용하는 코드를 관리해야하기 때문입니다. 가짜 트리 (왜냐하면 나는 그것이 어떻게 든 변화 할 때 자동적으로 업데이트 됨)에 다리를 놓을 필요가 있기 때문이다.

+0

문제를 재현하기위한 샘플 코드와 데이터를 게시하십시오. –

+0

샘플 코드를 게시 할 수 없습니다. 적어도 전체 트리/리프 클래스는 아닙니다. 그러나 자세한 설명이 업데이트됩니다 – SharpShade

답변

1

고유 한 문제가 있습니다 ... 표시하지 않으려는 계층 적 데이터에 일부 데이터 항목이 있지만 어떤 이유로 제거 할 수 없습니다. 그것이 당신의 문제를 요약한다면, 당신은 잘못된 것을하고있는 것입니다.

WPF에서는 UI에서 데이터 항목을 숨기지 않아도됩니다. 대신 컬렉션의 처음 부분에 넣지 않아도됩니다. 계층 적 데이터를 채우는 프로세스에 결함이있는 것처럼 들리며 UI에서 발생하는 문제를 처리하는 것보다 소스에서이를 수정하는 것이 좋습니다.

어떤 이유로 든 실제 프로세스를 수정할 수 없다면 전에 전에 데이터를 반복하여 표시하고 거기에 없어야하는 데이터 요소를 제거하면됩니다. WPF를 사용할 때 UI에 목적에 맞는 데이터를 제공하는 것이 가장 좋습니다.어떤 이유에서 건 당신도 그렇게 할 수없는 경우

그러나, 당신의 마지막 옵션은 단순히 추상 기본 클래스에 대한 추가 DataTemplate를 정의하고 단지 빈두고하는 것입니다 : 물론

<DataTemplate DataType="{x:Type YourDataTypesPrefix:YourBaseClass}"> 
</DataTemplate> 

, 각 하위 유형에 대해 DataTemplate을 정의해야하거나 빈 상태로 렌더링 할 수도 있습니다.

+0

다른 방법이 없습니까? 현재의 장점은 모든 "Tree"가 모든 것을 작동시키기 위해 코드에 필요한 모든 항목을 가지고 있다는 것입니다. UI는 목록보기에서 별도로 표시되기 때문에 항목을 표시하지 않아야합니다. 이제 모든 항목을 제거하면 코드가 작동하지 않거나 복잡한 문제가 발생합니다. 트리를 복사하고 항목을 제거한 다음 복사 된 트리를 표시하면 더 이상 바인드되지 않습니다. 트리를 변경하면 TreeView가 변경되지 않습니다. 물론 매번 복사 할 수는 있지만 엄청난 오버 헤드가 있습니다 ... (편집 : 빈 DataTemplate이 작동하지 않습니다 : - /) – SharpShade

+0

노드 (리프)에 새 속성을 추가 할 수 있습니다 (예 :'VisibleData'). 표시해야 할 노드 만 리턴하십시오. Linq 쿼리는 여기에 편리하게옵니다. 일반적으로 MVVM 접근 방식에서는 모델을 보유하고 데이터를 보유하고있는 객체를 조작합니다. 뷰 모델이라는 모델의 "표시 가능한 버전"을 만듭니다. 뷰 모델은 UI 용도로 적합하며 예제에서 표시되는 데이터 만 표시합니다. – RoadBump