2017-08-17 120 views
0

我有一个Telerik RadTreeView,其底层为CollectionViewSource。当我向该集合中添加新项目时,它将获得默认名称“新节点”。我想将该节点设置为编辑模式,以便用户可以立即为该节点输入新名称。添加新节点后标记节点名称

设置IsInEditModetrue将节点置于编辑模式,但不标记名称。光标只是在开始处,当前名称必须由用户首先标记。是否有可能自动标记当前名称?从我的XAML代码

摘录:

<Style TargetType="{x:Type telerik:RadTreeViewItem}" > 
    <Setter Property="IsInEditMode" Value="{Binding Path=IsInEditMode}"/> 
</Style> 

<telerik:RadTreeView.ItemEditTemplate> 
    <DataTemplate> 
     <TextBox Text="{Binding NodeName, Mode=TwoWay}" /> 
    </DataTemplate> 
</telerik:RadTreeView.ItemEditTemplate> 

<HierarchicalDataTemplate DataType="{NodeViewModel}" ItemsSource="{Binding NodeChildren}"> 
    <TextBlock Text="{Binding NodeName}" /> 
</HierarchicalDataTemplate > 

的C#代码只是设置NodeViewModeltrue的财产 “IsInEditMode”。

回答

1

你可以尝试处理GotKeyboardFocus事件在视图中TextBox

<telerik:RadTreeView.ItemEditTemplate> 
    <DataTemplate> 
     <TextBox Text="{Binding NodeName, Mode=TwoWay}" GotKeyboardFocus="TextBox_GotKeyboardFocus" /> 
    </DataTemplate> 
</telerik:RadTreeView.ItemEditTemplate> 

private void TextBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
{ 
    TextBox textBox = sender as TextBox; 
    textBox.Dispatcher.BeginInvoke(new Action(() => textBox.SelectAll()), System.Windows.Threading.DispatcherPriority.Background); 
} 
+0

谢谢您的答复 - 这工作。我发现只要将IsInEditMode属性设置为true,即使在Dispatcher线程中完成,或者延迟1ms的System.Threading.Timer,也可以实现。我不知道树中会发生什么,但显然它需要很短的时间,或者可能更换树来刷新。我想知道是否有一个更清洁的解决方案。 – telandor

+0

官方telerik论坛提出相同的建议:http://www.telerik.com/forums/edit-node-name-after-adding-new-node#ZC0S2WAvXUyJ4XNR63zCuA – telandor