2011-09-25 2 views
0

J'ai une logique avec ma boîte de texte qui dit, au foyer déplacer le début de sélection au dernier caractère, de sorte que la personne d'édition puisse continuer à écrire juste.TextBox dans DataTemplate, sur GotFocus ne peut pas affecter SelectionStart?

Cela a parfaitement fonctionné avec ceci:

private void TextBox_GotFocus(object sender, EventArgs e) 
    { 
     var textBox = sender as TextBox; 
     if (textBox == null) return; 

     textBox.SelectionStart = textBox.Text.Length; 
    } 

et

<Style TargetType="{x:Type TextBox}"> 
     <EventSetter Event="GotFocus" Handler="TextBox_GotFocus"/> 
    </Style> 

et

<DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate> 
     <TextBox Name="SomeTextBox" Text="{Binding Path=Pressure, UpdateSourceTrigger=PropertyChanged}" Padding="2,0,0,0" /> 
     <DataTemplate.Triggers> 
      <Trigger SourceName="SomeTextBox" Property="IsVisible" Value="True"> 
       <Setter TargetName="SomeTextBox" Property="FocusManager.FocusedElement" Value="{Binding ElementName=SomeTextBox}"/> 
      </Trigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</DataGridTemplateColumn.CellEditingTemplate> 

mais quand je me suis déplacé cela:

<DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding Path=Pressure, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ContentTemplate="{StaticResource DataGridTextBoxEdit}" /> 
    </DataTemplate> 
</DataGridTemplateColumn.CellEditingTemplate> 

et un modèle réutilisable:

<DataTemplate x:Key="DataGridTextBoxEdit"> 
     <TextBox Name="TextBox" Text="{Binding Content, RelativeSource={RelativeSource AncestorType=ContentControl}}" Padding="2,0,0,0" /> 
     <DataTemplate.Triggers> 
      <Trigger SourceName="TextBox" Property="IsVisible" Value="True"> 
       <Setter TargetName="TextBox" Property="FocusManager.FocusedElement" Value="{Binding ElementName=TextBox}"/> 
      </Trigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 

juste cessé de fonctionner. L'événement GotFocus se déclenche, mais je ne peux tout simplement pas assigner quoi que ce soit à SelectionStart, il ne le sauvegarde pas. A même essayé hardcoding:

private void TextBox_GotFocus(object sender, EventArgs e) 
    { 
     var textBox = sender as TextBox; 
     if (textBox == null) return; 

     textBox.SelectionStart = 5; 
    } 

mais ne fonctionnait pas. Il est également intéressant de noter que le texte est vide, seul DataContext est rempli à ce stade, cependant comme SelectionStart ne prend rien (sauvegarde), ce n'est pas bon pour moi.

Qu'est-ce que je fais mal?

Cordialement, Vladan

Répondre

1

Au point où la zone de texte se concentrer il n'a pas encore de texte, cela signifie que les feux de gestionnaire avant l'DataGrid affecte la valeur. Une façon d'obtenir ceci est de vérifier le premier changement de texte, puis de faire le changement de sélection, par ex.

private void TextBox_GotFocus(object sender, EventArgs e) 
{ 
    var textBox = sender as TextBox; 
    if (textBox == null) return; 

    var desc = DependencyPropertyDescriptor.FromProperty(TextBox.TextProperty, typeof(TextBox)); 
    EventHandler handler = null; 
    handler = new EventHandler((s, _) => 
     { 
      desc.RemoveValueChanged(textBox, handler); 
      textBox.SelectionStart = textBox.Text.Length; 
     }); 
    desc.AddValueChanged(textBox, handler); 
} 

(Ce code ne peut pas être très propre, utilisez à vos propres risques)

+0

Il est parfait! Je vous remercie! –

Questions connexes