2011-09-25 35 views
0

我有一個邏輯與我的文本框,它說,重點將選擇開始移動到最後一個字符,以便編輯人員可以繼續寫作。GotFocus上的DataTemplate中的TextBox無法分配SelectionStart?

這與此完美地工作:

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

     textBox.SelectionStart = textBox.Text.Length; 
    } 

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

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

,但是,當我提出這:

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

和可重複使用的模板:

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

它只是停止工作。 GotFocus事件觸發了,但是我根本不能分配任何東西給SelectionStart,它只是不保存它。試圖甚至硬編碼:

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

     textBox.SelectionStart = 5; 
    } 

但沒有奏效。值得注意的是,文本是空的,在這一點上只有DataContext被填充,然而由於SelectionStart沒有使用任何東西(保存),所以對我來說並不好。

我在做什麼錯?

親切的問候, 弗拉丹

回答

1

在其中的文本框獲得焦點也沒有任何文字尚未點,這意味着處理程序便會啓動之前DataGrid中指定的值。一種方法是檢查第一次文本改變,然後進行選擇改變,例如,

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

(此代碼可能不是很乾淨,在風險自負)

+0

這是完美的!謝謝! –

相關問題