2010-04-26 6 views
4

Je suis un peu un noob WPF, donc mes excuses pour toute loufoquerie inhérente à cette questionÉlément arborescence WPF modifiable sur doubleclick? (Avec des styles?)

Je suis en train de permettre l'édition d'étiquettes WPF TreeView avec un double-clic (!) - Je Nous avons fait un googled autour de ceci, et il semble que les deux façons de le faire sont avec un contrôle personnalisé ou avec un style qui cache l'un d'un TextBox/TextBlock. L'utilisation d'un style pour définir l'étiquette comme une zone de texte basée sur un DataTrigger semble assez facile (par exemple 1 ci-dessous), mais cela signifie qu'à chaque fois qu'une ligne est sélectionnée, elle est en cours de modification. Ce que je voudrais vraiment faire est d'activer ceci (Transition to textbox) sur un événement mousedoubleclick, mais il semble que les EventTriggers ne puissent pas être utilisés de la manière ci-dessous, car ils sont transitoires. (Il ne semble pas que je puisse simplement utiliser l'événement DoubleClick dans codebehind, car cela ne me permet pas d'affecter les contrôles affichés pour afficher/masquer les zones de texte). L'utilisation d'un contrôle personnalisé complet semble être l'alternative - il existe un exemple de travail AAALMOST ici (http://www.codeproject.com/KB/WPF/editabletextblock.aspx), mais cela ne fonctionne pas en présence de clauses HierachicalDataTemplate (et il ne semble pas qu'une solution soit disponible) .

(par exemple 1 - passage de textblock à textbox lorsqu'il est sélectionné)

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

Répondre

4

est-il utile:

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

assez simple et cela fonctionne pour moi bien.

0

Et si au lieu de déclencher sur IsSelected, vous vous déclenchez sur une propriété personnalisée de vos données liées comme IsEditing? Vous pouvez alors définir IsEditing sur true chaque fois que vous souhaitez que cela se produise (c'est-à-dire dans votre cas, lorsque vous cliquez sur le bouton de la souris).

0

Jetez un oeil à CallActionMethod de Blend. Ce déclencheur spécial vous permet de faire un lien lâche entre n'importe quel événement comme un double-clic et une méthode dans votre code derrière.

Si vous préférez utiliser une commande, vous pouvez faire la même chose avec InvokeCommandAction. Vous pouvez connecter n'importe quelle commande à un événement.