0

テキストボックスには、フォーカスで選択開始を最後の文字に移動して、編集者が書き続けることができるようにするというロジックがあります。

これはこれで完全に機能しました:

    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は何も取得(保存)していないため、私には適していません。

私は何が間違っているのですか?

よろしく、ウラダン

4

1 に答える 1

1

TextBox がフォーカスを取得した時点ではまだテキストがありません。これは、DataGrid が値を割り当てる前にハンドラーが起動することを意味します。これを回避する 1 つの方法は、最初のテキストの変更を確認してから選択の変更を行うことです。

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

(このコードはきれいではないかもしれません。自己責任で使用してください)

于 2011-09-25T22:31:10.767 に答える