2013-07-10 1 views
0
<TreeView Name="MyTreeView" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling"> 
    <TreeView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel IsItemsHost="True"/> 
     </ItemsPanelTemplate> 
    </TreeView.ItemsPanel> 
    <TreeView.Resources> 
     <DataTemplate DataType="{x:Type EntityType:MyFixedDevice}"> 
      <TreeViewItem IsHitTestVisible="True" IsEnabled="True"> 
      <TreeViewItem.Header> 
       <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}" 
          IsHitTestVisible="True" IsEnabled="True"/> 
      </TreeViewItem.Header> 
      </TreeViewItem> 
     </DataTemplate> 
    </TreeView.Resources> 
    <TreeView.Items> 
     <TreeViewItem Header="Data Warehouse"> 
      <TreeViewItem.Items> 
       <TreeViewItem Header="Platforms"> 
        <TreeViewItem.Items> 
         <TreeViewItem ItemsSource="{Binding OBJS, Converter={StaticResource COBJSourceConverter}, ConverterParameter=Fixed}"> 
          <TreeViewItem.Header> 
           <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, 
              Path=Parent.Items.Count, 
              StringFormat=Fixed Devices ({0})}"> 
           </TextBlock> 
          </TreeViewItem.Header> 
         </TreeViewItem> 
        </TreeViewItem.Items> 
       </TreeViewItem> 
      </TreeViewItem.Items> 
     </TreeViewItem> 
    </TreeView.Items> 
</TreeView> 

DataTemplate을 사용하여 만든 TreeViewItem을 왼쪽 마우스로 클릭하면 선택되지 않습니다. 코드에서 코드를 선택하면 다시 선택하거나 선택을 취소 할 수 없습니다.DataTemplate을 사용하여 만든 TreeViewItem을 왼쪽 마우스로 클릭하면 어떻게 선택되지 않습니까?

TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem; 
if(selectedItem != null) { 
    selectedItem.IsSelected = false; 
    MyTreeView.Focus(); 
} 

은 내가 TreeViewTreeViewItems 선택을 취소하기 위해 아래 사용하려했지만, 그것은 단지 그들이 정적 XAML에서 설정하는 경우 TreeViewItems의 선택을 취소하고, 그들이는 ItemsSourceDataTemplate을 사용하여 생성되지 않은 경우?

답변

1

당신은 실제로 (즉, TreeViewItem 템플릿을 변경해야합니다? 그것의 얼굴에

, 당신의 TreeView 걸릴 치료를 할 수있는 것 같다 당신의 고정 장치에 대한 TreeViewItem 템플릿 특별한 일을 할 것입니까의 자신의 항목을 만들고 객체 표현을위한 간단한 템플릿을 사용하면됩니다.

나는 당신이 달성하려는 것을 오해했을 수도 있습니다.

+0

흠 ...'TreeViewItem' 객체를 만들어서 TreeViewItem.Items에 넣을 필요가 있다고 생각했거나 그렇게 취급하지는 않을 것입니다.하지만 이것은 저에게 효과적입니다. –

+0

'TreeView'는'ItemsControl'에서 상속 받기 때문에 자동으로 모든 항목을 적절한 컨테이너 ('TreeViewItem')에 래핑합니다. 템플리트에 또 다른'TreeViewItem'을 넣는 것은 그것이 두 번 감싸 인 것을 의미하며, 약간 혼란 스럽습니다. – Chris

1

당신은 SelectedItem 사용자가 설정 한 ItemSource 모음이 아닌 실제 TreeViewItem의 당신의 유형 T에서와 DataContext 유형에 해당 ItemSource을 설정합니다.

왜 캐스트가 실패합니까? 당신이 ItemSource을 설정하지 않고 바로 XAML에서 그들을 만들 때

지금, SelectedItem 단지 TreeViewitem 자체와 as 캐스트 잘 작동합니다.

업데이트 : 코드 숨김

<Window.Resources> 
    <x:Array x:Key="someArray" 
      Type="sys:String"> 
    <sys:String>Hello</sys:String> 
    <sys:String>World</sys:String> 
    </x:Array> 
</Window.Resources> 
<StackPanel> 
    <TreeView x:Name="MyTreeView" 
      ItemsSource="{DynamicResource someArray}" /> 
    <Button Click="ButtonBase_OnClick" 
      Content="Some" /> 
</StackPanel> 

과 :

그것은 당신의 DataTemplate

와 아무 상관이 시도

지금
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { 
    TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem; 
    if (selectedItem != null) { 
    selectedItem.IsSelected = false; 
    MyTreeView.Focus(); 
    } else { 
    Debug.WriteLine("Not TreeViewitem"); 
    Debug.WriteLine(MyTreeView.SelectedItem); 
    } 
} 

응용 프로그램이 실행될 때 항목을 클릭하면 D 다음 Button

검사를 출력 창을 클릭하면

Not TreeViewitem 
Hello 

DataTemplate은 단지보기에서 사용자 정의 데이터 유형을 시각화하는 데 도움이 볼 수 있습니다. 실제 TreeViewItem 시도 얻을 귀하의 경우

:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { 
    TreeViewItem selectedItem = 
    MyTreeView.ItemContainerGenerator.ContainerFromItem(MyTreeView.SelectedItem) as TreeViewItem; 
    if (selectedItem == null) 
    return; 
    selectedItem.IsSelected = false; 
    MyTreeView.Focus(); 
} 

을이 가정으로 HierarchicalDataTemplate 작동하지 않습니다 ^^ 모음이 TreeView

솔루션에 바인딩 할 때이 동작을 것입니다 . 더 많은 옵션은 this을 참조하십시오.

+0

하지만'DataTemplate'을 사용하여 Type 'T'에 대한'TreeViewItem'을 생성합니다. –

+0

@Bob. 그것은 당신의'DataTemplate'이 내 업데이트를 확인하는 것과 관련이 없습니다. – Viv

+0

@Bob. 귀하의 요구 사항에 대한 답변의 하단에 해결책을 추가했습니다. 그게 효과가 있는지보십시오. – Viv