我有一个TreeView
,其中包含以下XAML:
<TreeView ItemsSource="{Binding Folders, UpdateSourceTrigger=PropertyChanged}" x:Name="tree">
<TreeView.InputBindings>
<KeyBinding Key="Delete"
Command="{Binding DataContext.DeleteFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
CommandParameter="{Binding ElementName=tree, Path=SelectedItem}"/>
<KeyBinding Key="F2"
Command="{Binding DataContext.RenameFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
CommandParameter="{Binding ElementName=tree, Path=SelectedItem}"/>
</TreeView.InputBindings>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Folders, UpdateSourceTrigger=PropertyChanged}">
<Grid>
<Label Content="{Binding Name}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Rename"
Command="{Binding DataContext.RenameFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
CommandParameter="{Binding ElementName=tree, Path=SelectedItem}"/>
<MenuItem Header="Delete"
Command="{Binding DataContext.DeleteFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
CommandParameter="{Binding ElementName=tree, Path=SelectedItem}"/>
</ContextMenu>
</Label.ContextMenu>
<Label.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick"
Command="{Binding DataContext.SelectFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
CommandParameter="{Binding ElementName=tree, Path=SelectedItem}" />
</Label.InputBindings>
</Label>
</Grid>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
点击TreeViewItem
上的重命名(或按F2),我想用TextBox
替换标签。
这样做的最佳方式是什么?
我已经尝试获取Position
的SelectedItem的Bounds
或TreeView
,但这是文件夹的一个实例,所以我无法获得那里的信息。
答案 0 :(得分:0)
我发现实现所需功能的更好方法是永久使用TextBox
,但将IsReadOnly
属性设置为true。您可以将Label
属性设置为TextBox
,以使其可编辑,而不是将TextBox.IsReadOnly
换成True
。
此外,您还可以添加Style Setter
以使TextBox
在不可编辑时看起来不是TextBox
:
<Style x:Key="TextBlockStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
<Setter Property="BorderThickness" Value="0" />
</Trigger>
</Style.Triggers>
</Style>
然后,您可以从代码隐藏或查看模型中绑定bool IsEditable
属性,以更改TextBox
是否应该可编辑:
<TextBox Text="{Binding SomeTextProperty}" IsReadOnly="{Binding IsEditable}" ... />
然后,您需要做的就是使字段可编辑(在您的代码隐藏或视图模型中):
IsEditable = true;
答案 1 :(得分:0)
您最常创建一个具有可编辑模式的UserControl,如combobox,并更改模式运行时。 出于类似的目的,我更改了组合框模板并构建了自己的控件。
顺便提一下,我建议看看组合框控制模板。 (IsEditable与否)