获取所选TreeViewItem的位置

时间:2014-09-26 13:55:36

标签: c# wpf treeview

我有一个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的BoundsTreeView,但这是文件夹的一个实例,所以我无法获得那里的信息。

2 个答案:

答案 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与否)