2013-07-09 4 views
1
<DataTemplate DataType="{x:Type EntityType:FixedDevice}"> 
    <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}"/> 
</DataTemplate> 

<TreeView.ItemContainerStyle> 
    <Style TargetType="TreeViewItem"> 
     <EventSetter Event="PreviewMouseRightButtonUp" Handler="TreeViewItem_RightClick"/> 
    </Style> 
</TreeView.ItemContainerStyle> 
<TreeViewItem Header="Data Warehouse"> 
    <TreeViewItem.Items> 
     <TreeViewItem Header="Platforms"> 
      <TreeViewItem.Items> 
       <TreeViewItem> 
        <TreeViewItem.Header> 
         <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, 
            Path=Parent.Items.Count, 
            StringFormat=Public ({0})}"> 
         </TextBlock> 
        </TreeViewItem.Header> 
       </TreeViewItem.Header> 
      </TreeViewItem.Items> 
     </TreeViewItem> 
    </TreeViewItem.Items> 
</TreeViewItem> 

private void TreeViewItem_RightClick(object sender, MouseButtonEventArgs e) { 
     TreeViewItem item = sender as TreeViewItem; 
     if(item != null) { item.Focus(); item.IsSelected = true; } 
     e.Handled = true; 
} 

어떻게하면 가장 오른쪽 노드 만 선택합니까? 클릭 한 사람이 아닌가요? Item 자체가 TreeViewItem이 아닌 ItemsSource과 비슷하지만 TextBlockDataTemplate과 비슷하지만 시각적으로 TreeView에서 개체를 선택하려면 어떻게해야합니까?ItemsSource Right-Click이있는 TreeViewItem이 항목을 선택하지 않습니다.

편집은 @Viv 응답을 기반으로 한 답변입니다. 는 내가 TextBlock을 다음 Item가에 있던 TreeViewItem. 검색 e.OriginalSource를 사용하지 결국

private void TreeViewItem_RightClick(object sender, MouseButtonEventArgs e) { 
    TreeViewItem item = (e.OriginalSource as FrameworkElement).Parent as TreeViewItem; 
    if(item == null) { 
     item = e.Source as TreeViewItem; 
     if(item == null) { 
      return; 
     } 
    } 
    item.IsSelected = true; 
    e.Handled = true; 
} 

답변

1

무엇을 당신이 찾고있는 것은 e.Source하지 않기 때문입니다 sender

오른쪽 버튼으로 클릭 핸들러를 전환 해보십시오 로 :

private void TreeViewItem_RightClick(object sender, MouseButtonEventArgs e) { 
    TreeViewItem item = e.Source as TreeViewItem; 
    if (item == null) 
    return; 
    // item.Focus(); 
    item.IsSelected = true; 
    e.Handled = true; 
} 

Sample Download

+0

나는 그 일을 시도하고, 그것은 여전히 ​​나에게 같은 결과를 주었다. 'e.Source'는'sender'와 같습니다. –

+0

@Bob. 나를 위해 잘못하지 않으면 처리기에서 '보낸 사람'을 사용하는 경우에만 문제를 재현 할 수 있습니다. 'e.Source'는 괜찮습니다. 대답에 샘플을 추가했습니다. 그것을 시도하고 그게 잘 작동하는지 또는 해당 프로젝트에서도 동일한 문제가 표시되는지 확인하십시오. – Viv

+0

그래, 정확히 문제가있는 곳을 알아 냈어. 'TreeViewItem.Header'에 있습니다. 'Header = "Text Here"는 클릭에 응답하지 않고 ('TreeViewItem.Header'에 대한 위의 편집 참조),'eSource'가 루트 뒤에있는 첫 번째 노드 인 do 안에있는'Items' . –