2012-11-20 2 views
0

현재 WPF TreeView 디스플레이에서 작업 중입니다. 이 트 리뷰의 내용은 바인딩 일반 데이터에서 있습니다 :Doing owner는 데이터 바인딩으로 생성 된 WPF 항목을 그립니다.

<TreeView HorizontalAlignment="Stretch" 
     x:Name="LogMonitor" 
     VerticalAlignment="Stretch" 
     ItemsSource="{Binding LogEntries, UpdateSourceTrigger = PropertyChanged }"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate 
       DataType="{x:Type Log:SystemLog}" 
       ItemsSource="{Binding Path=Lines}"> 
       <TextBlock Text="{Binding Header}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

트 리뷰는 키워드에 의해 필터링되어 있지만, 나는 또한 트 리뷰에 남아있는 모든 TreeViewItem에 대한 키워드를 강조하고 싶습니다. 헤더와 TreeViewItem이있는 경우 예를 들어

"이것은 사과는"사용자는 가 "사과" 필터링 키워드로, 그것은 TreeViewItem 보이는 표시해야합니다 입력과 같은 :

Highlight

몇 가지 접근법을 시도했지만 운이별로 없습니다.

  1. 이 내장 사용 스타일링 :
    강조 표시 스트링 매칭과 일치하는 하위 밑에 컬러 블록 배치를 필요로한다. 그런 식으로 의상을 입힐 수있는 붙박이 작풍 템플렛이 보인다.

    는 뷰 모델 객체의 캔버스에
  2. 그리기와 TreeViewItem에 캔버스를 결합 :
    그것은이 TreeViewItem 한 번 선택을 선택하지 않은 경우에만 작동, 내장 된 그리기 호출에 캔버스를 칠 수있는 방법을 찾을 수 없습니다 "강조 표시"스타일과 그냥 빈 영역을 남겨주세요.

  3. 는 TreeViewItem의 서브 클래스를 생성하고 기능의 OnRender 무시하고 TreeViewItem의 내 서브 클래스를 반환하는 트 리뷰의 ItemContainerGenerator를 대체 :
    는, 트 리뷰의 ItemContainerGenerator이 설정 가능 및 비 가상 불가능하지 않다 .

    는 그리고 나는 단지 또 하나의 옵션을 생각할 수 있습니다 :

  4. 는, 데이터 바인딩 포기 나 자신에 의해 트 리뷰의 항목 목록에 오버라이드의 OnRender 기능을 TreeViewItem의 서브 클래스를 밀어 넣습니다.

나는 실험에서 긍정적 인 결과를 준다. 그러나 데이터 바인딩 패러다임을 삭제하는 것에 대해 불편 함을 느낍니다. 그래서 나는 Data Binding 선물로 소유자 그리기를하는 다른 방법이 있는지 물어보고 싶습니다.

감사합니다.

+0

편도 바인딩 S : –

+1

에 'UpdateSourceTrigger = PropertyChanged'를 사용하는 것은 의미가 없습니다. 시각적 레이어를 검사하고 빨간색 사각형을 추가하는 데 사용할 수있는 Adorner 레이어가 있는지 확인하기 위해 스눕을 사용합니다. Treeview 위에 있었지만 노드 텍스트 아래에있었습니다. TreeView의 adorner 레이어가 해결책이 될지 궁금합니다. – Alan

+0

놀라운 도구 인 Snoop을 발견했습니다. 고맙습니다. 나는 아직도 내가 원하는 것을할만한 방법을 찾지 못했지만. 내가 시도한 방향 TreeView GetContainerForItemOverride 재정의하고 원하는 하위 클래스를 반환합니다. 그런 다음 TreeViewItem 하위 클래스에서 OnRender 재정의를 수행합니다. 그것은 어떻게 든 작동합니다, 내가 거의 제거 할 수없는 몇 가지 고장이 있습니다. –

답변

0

텍스트를 세 영역, 즉 사전 강조 표시, 강조 표시 및 강조 표시로 나누는 사용자 정의 컨트롤을 만듭니다. 표준 바인딩 및 스타일을 사용하여이 모든 작업을 수행 할 수 있습니다. 각 TreeViewItem은 이러한 컨트롤 중 하나입니다.

+0

인수를 위해서, 동일한 텍스트에 키워드가 두 번 표시되면 어떻게해야합니까? – Alan

+0

좋은 지적. 이 방법을 사용하면 시나리오가 없습니다. TextBlock을 적절한 스타일로 채우는 StackPanel을 사용하는 또 다른 아이디어. 아마 재산의 변화에 ​​그것을 채우십시오. –