我(尝试)构建文件系统的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 );
}
}
答案 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页面。