7
votes

Article d'arbre WPF modifiable sur DoubleClick? (avec des styles?)

Je suis un peu un peu de WPF noob, donc excuses de tout entièrement inhérent dans cette question (!)

J'essaie de permettre l'édition des étiquettes WPF Treeview avec un DoubleClick - J'ai googlé autour de cela, et on dirait que les deux façons de faire sont avec un contrôle personnalisé ou avec un style qui masque l'une d'une zone de texte / textblock. p>

Utilisation d'un style pour définir l'étiquette pour être une zone de texte basée sur un fichier de données Semble assez facile (par exemple 1 ci-dessous), mais cela signifie que tout temps une ligne est sélectionné, il est "édité". P>

Qu'est-ce que j'aimerais vraiment faire, c'est de l'activer (transition vers la zone de texte) Sur un événement de Mousedoubleclick, mais il semble que l'événementTriggers ne puisse être utilisé de la manière ci-dessous, car ils sont transitoires. (Il ne semble pas que je puisse simplement utiliser l'événement DoubleClick à CodeBeHind, car cela ne me permettez pas d'affecter les commandes affichées pour afficher / masquer les boîtes de texte). P>

Utiliser Le contrôle personnalisé soufflé semble que l'alternative - il y a un exemple de travail le plus achalandé ici ( http: // www .codeproject.com / kb / wpf / edittabletextBlock.aspx ), mais cela ne fonctionne pas en présence de clauses hiérarchiquesDaTemplate (et cela ne semble pas qu'une solution est à venir). P>

(par exemple, 1 - passer de TextBlock sur TextBox lors de la sélection) P>

<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>


0 commentaires

3 Réponses :


5
votes

Aide-t-il:

        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 commentaires

0
votes

Et si, au lieu de vous déclencher, vous êtes issu, vous déclenchez sur une propriété personnalisée de vos données reliées telles que l'iSediting? Vous pouvez ensuite définir l'identification de la véritable si vous souhaitez changer pour se produire (c'est-à-dire dans votre cas, lorsque le bouton de la souris est cliqué).


0 commentaires