选择的WPF treeviewitem不会触发(和其他问题)

时间:2014-02-10 21:29:00

标签: c# wpf treeview treeviewitem

我(尝试)构建文件系统的TreeView(节点是目录,叶子是文件)。

我有xaml来进行数据绑定,但是我无法触发TreeViewItem选择的事件(或者我无法检测到它)。

<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>

我将'Node(目录)'显示为TreeViewItem(以便我可以进行扩展器切换),但是当单击或双击时,TVI_Selected方法不会被调用。单击Leaf(文件)'或双击时,将调用TreeSelectionChanged方法,但它不是TreeViewItem(用于抑制扩展器切换)。

我想截取Selected事件,以便我可以用适当的子数据替换“Please Wait ...”。

由于我是新手,我很有可能做一些愚蠢或严重的事情,或者只是没有得到它 - 如果有更好的方法可以做到这一点,我很乐意听到了。

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 );
    }
}

1 个答案:

答案 0 :(得分:3)

我认为你的问题可能在你的HierarchicalDataTemplate中。您不应在TreeViewItem声明TreeView,因为DataTemplate会自动将您在TreeViewItem中定义的内容自动换行到<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> 。尝试删除它并在HierarchicalDataTemplate.ItemTemplate property

中定义子项
{{1}}

有关详细信息,请参阅Mike Hillberg在MSDN上关于Wpf和Silverlight的博客的TreeView and HierarchicalDataTemplate, Step-by-Step页面。