这里采用的是DecExpress的<dxg:TreeListControl>控件,主要思想是节点模板原本为<TextBlock> 重命名时改为可编辑的<TextBox>,失去焦点时<TextBox>隐藏<TextBlock>显示且两个控件绑定的数据一致,前台代码如下:
<dxg:TreeListControl Name ="treeCatalog" ItemsSource="{Binding ListWorkSpace}" Margin="0,0,0,0" MaxHeight="1200" MaxWidth="2000" SelectionChanged="treeCatalog_SelectionChanged" PreviewMouseDown="treeCatalog_PreviewMouseDown">
<dxg:TreeListControl.Columns>
<dxg:TreeListColumn FieldName="NodeImage" Visible="False" VisibleIndex="0"/>
<dxg:TreeListColumn FieldName="Name" Visible="True" VisibleIndex="1">
<dxg:TreeListColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Height="22" Padding="3,2,0,0"
VerticalAlignment="Center"
Text="{Binding Path=RowData.Row.Name}"
FontWeight="{Binding Path=RowData.Row.IsActive,Converter={StaticResource btf}}"
FontSize="{Binding Path=RowData.Row.IsActive,Converter={StaticResource bts}}"
IsHitTestVisible="True" PreviewMouseRightButtonDown="TextBlock_PreviewMouseRightButtonDown"></TextBlock>
<TextBox Height="22" BorderThickness="0"
VerticalContentAlignment="Center"
Padding="0" Margin="0"
VerticalAlignment="Center"
Text="{Binding Path=RowData.Row.Name}"
FontWeight="{Binding Path=RowData.Row.IsActive,Converter={StaticResource btf}}"
FontSize="{Binding Path=RowData.Row.IsActive,Converter={StaticResource bts}}"
IsHitTestVisible="True"
Visibility="Collapsed" LostFocus="TextBox_LostFocus" KeyDown="TextBox_KeyDown"/>
</StackPanel>
</DataTemplate>
</dxg:TreeListColumn.CellTemplate>
</dxg:TreeListColumn>
</dxg:TreeListControl.Columns>
</dxg:TreeListControl>
后台代码
#region 重命名
TextBox tbox = null;
TextBlock tbl = null;
StackPanel SP = null;
private void rename_Click(object sender, RoutedEventArgs e)
{
tbox = FindVisualChild<TextBox>(SP);
tbl.Visibility = Visibility.Collapsed;
tbox.Visibility = Visibility.Visible;
tbox.Focus();
tbox.SelectAll();
}
private void TextBlock_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
tbl = (TextBlock)sender;
SP = GetParentObjectEx(tbl);
}
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
tbl.Visibility = Visibility.Visible;
tbox.Visibility = Visibility.Collapsed;
}
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
tbl.Visibility = Visibility.Visible;
tbox.Visibility = Visibility.Collapsed;
}
}
public StackPanel GetParentObjectEx(DependencyObject obj)
{
DependencyObject parent = VisualTreeHelper.GetParent(obj);
while (parent != null)
{
if (parent is StackPanel)
{
return (StackPanel)parent;
}
parent = VisualTreeHelper.GetParent(parent);
}
return null;
}
private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
#endregion