最近在用WPF做东西,遇到个问题困了我好久都搞不定,只好来求大神赐教,用HierarchicalDataTemplate作为显示TreeView节点的模板,程序可以正常运行,我现在想实现的功能是:当选中一个TreeView节点,点击“添加”后,在所选节点的最后一个子节点之后添加一个TextBox,用来添加一个新的节点。这个功能类似于windows资源管理器中新建文件夹,这个功能在winform中只用new TreeViewItem(),然后调用TreeViewItem的Add()方法,把TextBox添加进TreeViewItem就行了,可是我现在是用HierarchicalDataTemplate作为TreeView节点的模板,这样的话,这个功能该如何实现???
windows资源管理器中的新建文件夹截图:
我的程序运行截图:
XAML代码如下:
<Window x:Class="WebSiteFavorite.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WebSiteFavorite" xmlns:sys="clr-namespace:System;assembly=mscorlib" Title="MainWindow" WindowStartupLocation="CenterScreen" Height="600" Width="800" Loaded="Window_Loaded"> <Window.Resources> <HierarchicalDataTemplate x:Key="TreeViewTemplate" DataType="{x:Type local:PropertyNodeItem}" ItemsSource="{Binding Children}"> <StackPanel> <Image/> <TextBlock Text="{Binding DisplayName}"/> <StackPanel.ToolTip> <TextBlock Text="{Binding FileSystemInfo.FullName}"/> </StackPanel.ToolTip> </StackPanel> </HierarchicalDataTemplate> </Window.Resources> <Grid> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" MinWidth="50"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition MinWidth="100"/> </Grid.ColumnDefinitions> <DockPanel> <TreeView Name="tvFavorite" TreeViewItem.Selected="tvFavorite_Selected" ItemTemplate="{StaticResource TreeViewTemplate}" FontSize="15"> <TreeView.ItemContainerStyle> <Style TargetType="TreeViewItem"> <Setter Property="IsExpanded" Value="False"/> </Style> </TreeView.ItemContainerStyle> <TreeView.ContextMenu> <ContextMenu> <MenuItem Name="tvcmAdd" Header="添加" Click="tvcmAdd_Click"/> <MenuItem Name="tvcmDelete" Header="删除"/> </ContextMenu> </TreeView.ContextMenu> </TreeView> </DockPanel> <GridSplitter Grid.Column="1" HorizontalAlignment="Center" Width="5" Background="#BBB"/> </Grid> </Grid> </Window>
实体类PropertyNodeItem代码如下:
1 public class PropertyNodeItem 2 { 3 string icon = ""; 4 5 public string Icon 6 { 7 get { return icon; } 8 set 9 { 10 icon = value; 11 } 12 } 13 14 string displayName = ""; 15 16 public string DisplayName 17 { 18 get { return displayName; } 19 set 20 { 21 displayName = value; 22 } 23 } 24 25 bool isExpanded = false; 26 27 public bool IsExpanded 28 { 29 get { return isExpanded; } 30 set { isExpanded = value; } 31 } 32 33 FileSystemInfo fileSystemInfo = null; 34 35 public FileSystemInfo FileSystemInfo 36 { 37 get { return fileSystemInfo; } 38 set 39 { 40 fileSystemInfo = value; 41 } 42 } 43 44 private ObservableCollection<PropertyNodeItem> children = new ObservableCollection<PropertyNodeItem>(); 45 46 public ObservableCollection<PropertyNodeItem> Children 47 { 48 get { return children; } 49 set { children = value; } 50 } 51 } 52 }
这个如果是用的是ViewModel绑定的话,可能好解决一些,手上没有示例。大概意思就是:节点绑定到一个集合,添加时在后台给集合中增加一个空的Item,Xmal中可以使用trigger,来根据内容确定显示什么控件。