2014-02-10 1 views
1

파일 시스템의 TreeView를 작성하려고합니다 (노드는 디렉토리이고, 나뭇잎은 파일 임).선택한 WPF treeviewitem이 실행되지 않습니다 (및 기타 문제)

나는 데이터 바인딩을 할 xaml을 가지고 있지만, TreeViewItem selected 이벤트를 발생시킬 수 없다. 그렇지 않으면 발견 할 수 없다.

<Window x:Class="List.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:List" 
     xmlns:dmodels="clr-namespace:List.DataModels" 
     Title="MainWindow" Height="350" Width="525"> 

     <Window.Resources> 
      <ResourceDictionary> 
      <HierarchicalDataTemplate DataType="{x:Type dmodels:DirectoryNode}" ItemsSource="{Binding Children}"> 
       <TreeViewItem FontSize="16" FontWeight="Bold" Header="{Binding Path=DisplayName}" Selected="TVI_Selected" > 
         <TextBlock Text="Please Wait..." MouseDown="Listbox1_MouseLeftButtonDown" /> 
       </TreeViewItem> 
      </HierarchicalDataTemplate> 
      <DataTemplate DataType="{x:Type dmodels:FileNode}"> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Margin="20,0,0,0" Text="{Binding Path=DisplayName}" FontWeight="Bold" MouseDown="Listbox1_MouseLeftButtonDown" /> 
        </StackPanel> 
      </DataTemplate> 
     </ResourceDictionary> 
     </Window.Resources> 

    <Grid> 
     <TreeView x:Name="myTree" ItemsSource="{Binding Files}" SelectedItemChanged="TreeSelectionChanged" > 
     </TreeView> 
    </Grid> 
</Window> 

은 내가 '노드 (디렉토리)'(나는 확장기 전환을 얻을 수 있도록)를 TreeViewItem로 표시가 있지만, 그것을 클릭하거나 두 번 클릭하거나 때 TVI_Selected 메서드가 호출되지 않습니다 . Leaf (파일) '을 클릭하거나 두 번 클릭하면 TreeSelectionChanged 메서드가 호출되지만 TreeViewItem (확장기 토글을 표시하지 않음)이 아닙니다.

"Please Wait ..."를 적절한 하위 데이터로 바꿀 수 있도록 Selected 이벤트를 가로 채고 싶습니다.

저는이 말을 처음 접했기 때문에 무언가 어리석은 일을하고 있거나 나쁘게 만하거나 또는 그걸 얻지 못할 확률이 높습니다. 더 좋은 방법이 있다면, 그것을 듣고.

private void TVI_Selected (object sender, RoutedEventArgs e) 
{ 
    Console.WriteLine (" TreeViewItem selection Changed "); 
} 

private void TreeSelectionChanged (object sender, RoutedPropertyChangedEventArgs<Object> e) 
{ 
    //Perform actions when SelectedItem changes 
    BaseNode node = e.NewValue as BaseNode; 

    if (node != null) 
    { 
     string str = node.DisplayName; 
     string s2 = (node.IsDirectory == true) ? "Directory" : "File"; 
     Console.WriteLine (" tree selection = {0} is a {1}", str, s2); 
    } 
} 

답변

3

내가 생각하는 당신의 HierarchicalDataTemplate에 문제 거짓말. 그래도 TreeViewDataTemplate에 정의 된 내용을 자동으로 TreeViewItem에 넣을 것이므로 TreeViewItem을 선언하지 않아도됩니다. 를 제거하고 HierarchicalDataTemplate.ItemTemplate property의 하위 항목을 정의하십시오 : 자세한 내용은 MSDN에서 WPF와 실버 라이트에 마이크 Hillberg의 블로그에서 TreeView and HierarchicalDataTemplate, Step-by-Step 페이지를 참조하십시오

<HierarchicalDataTemplate DataType="{x:Type dmodels:DirectoryNode}" 
    ItemsSource="{Binding Children}"> 
    <StackPanel> <!-- Define parent items here--> 
     <TextBlock FontSize="16" FontWeight="Bold" Text="{Binding Path=DisplayName}"> 
     <TextBlock Text="Please Wait..." MouseDown="Listbox1_MouseLeftButtonDown" /> 
    </StackPanel> 
    <HierarchicalDataTemplate.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" /> <!-- Define child items here--> 
     </DataTemplate> 
    </HierarchicalDataTemplate.ItemTemplate> 
</HierarchicalDataTemplate> 

.

+0

고마워요,하지만 그것 없이는 HDT에 TreeViewItem을 넣었습니다. 표시가 + (확장 토글)를 얻을 수 없었기 때문입니다. 그리고 포장이 풀린다면 왜 TreeViewItem이 존재합니까? 나는 똑똑한 사람이 되려고 노력하지 않고있다. 나는 이것을 얻지 못하고있다. 나는 당신이 준 링크를 다시 보게 될 것이다. (나는 믿는다.) 감사! –

+0

자녀 항목을 정의하지 않았기 때문에 '+'가 표시되지 않았을 수 있습니까? 'TreeViewItem'은'ListBoxItem', 또는'MenuItem'처럼 데이터 객체의 '컨테이너'로서 존재합니다. 우리는 데이터 내용과 별도로 컨테이너를 스타일링하고 조작 할 수 있습니다 ... 매우 유용합니다. 예를 들어, 컨테이너에는 항상 유용한 IsSelected 속성이있어 어떤 데이터 항목이 선택되었는지 알 수 있습니다. – Sheridan

+0

예 - 존재했던 동안 어린이가 비었기 때문에 +가 표시되지 않았습니다. 이제 '더미'항목에 대한 필요성이 생겼습니다 (다소 어수선하고 그렇습니까?). 고마워요 - (아기 단계) 진행하고 있습니다. 인내와 도움에 감사드립니다. –