Редактируемый древовидный элемент WPF при двойном щелчке? (со стилями?) - PullRequest
5 голосов
/ 26 апреля 2010

Я немного новичок в WPF, поэтому прошу прощения за любую врожденную глупость в этом вопросе (!)

Я пытаюсь разрешить редактирование меток в виде дерева WPF двойным щелчком мыши - я обыскал это, и похоже, что два способа сделать это с помощью пользовательского элемента управления или со стилем, который скрывает один из TextBox /TextBlock.

Использование стиля для установки метки в виде textBox на основе DataTrigger кажется достаточно простым (например, 1 ниже), но это означает, что каждый раз, когда выбирается строка, она «редактируется».

Что я действительно хотел бы сделать, так это включить это (Переход к текстовому полю) для события mousedoubleclick, но кажется, что EventTriggers не могут быть использованы описанным ниже способом, потому что они временные. (Кажется, я не могу просто использовать событие DoubleClick в codebehind, потому что это не (??) позволяет мне влиять на отображаемые элементы управления, чтобы показать / скрыть текстовые поля).

Использование полноценного пользовательского элемента управления кажется альтернативой - здесь есть рабочий пример AAALMOST (http://www.codeproject.com/KB/WPF/editabletextblock.aspx), однако он не работает при наличии предложений HierachicalDataTemplate (и он не выглядит как решение предстоящее).

(например, 1 - переключаться из текстового блока в текстовое поле, если выбрано)

<Window x:Class="treetest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:treetest"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <Style x:Key="EditableContentControl" TargetType="{x:Type ContentControl}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate DataType="{x:Type local:CompositeViewModel}">
                    <TextBlock Text="{Binding Path=Name}" />
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsSelected,RelativeSource=RelativeSource AncestorType={x:Type TreeViewItem}}}"
                 Value="True">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate DataType="{x:Type local:CompositeViewModel}">
                            <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                    </Setter.Value>
                </Setter>                
            </DataTrigger> 
        </Style.Triggers>
    </Style>  
</Window.Resources>
<Grid>
    <TreeView Margin="12,12,115,12" Name="treeView1"  
              ItemsSource="{Binding Path=GetRootData}"
              >
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:CompositeViewModel}" ItemsSource="{Binding Path=Children}">
                <ContentControl Content="{Binding}" Style="{StaticResource EditableContentControl}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</Grid>
</Window>

Ответы [ 3 ]

4 голосов
/ 21 ноября 2010

это помогает:

        string name = "some name";
        var treeItem = new TreeViewItem()
            {
                Header = name,
            };
        var textBox = new TextBox()
            {
                Text = name,
            };
        treeItem.MouseDoubleClick += (o, e) =>
            {
                TreeItem.Header = textBox;
            };
        textBox.LostFocus += (o, e) =>
            {
                treeItem.Header = textBox.Text;
                name = textBox.Text;
            };

это довольно просто, и у меня это хорошо работает.

0 голосов
/ 24 сентября 2011

Взгляните на CallActionMethod от Blend. Этот специальный триггер позволяет создать свободную связь между любым событием, например двойным щелчком, и методом в вашем коде.

Если вы предпочитаете использовать команду, вы можете сделать то же самое с InvokeCommandAction . Вы можете подключить любую команду к событию.

0 голосов
/ 22 августа 2011

Что если вместо запуска на IsSelected вы активируете пользовательское свойство ваших связанных данных, таких как IsEditing?Затем вы можете установить IsEditing в значение true, когда вы хотите, чтобы это произошло (например, в вашем случае при нажатии кнопки мыши).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...