WPF ItemsControl - 添加项目时更改焦点

时间:2014-10-20 17:55:37

标签: c# wpf dynamically-generated

我有一个ObservableCollectiong<StringWrapper>(StringWrapper per this post)名为Paragraphs绑定到ItemsControl,其ItemTemplate只是一个绑定到StringWrapper.Text的TextBox。

XAML

<ItemsControl Name="icParagraphs" Grid.Column="1" Grid.Row="7" ItemsSource="{Binding Path=Paragraphs, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">
    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <StackPanel Orientation="Vertical">
                <ItemsPresenter />
            </StackPanel>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
                <TextBox Name="tbParagraph" TextWrapping="Wrap" AcceptsReturn="False" Text="{Binding Path=Text}" Grid.Column="0" KeyUp="tbParagraph_KeyUp" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

C#

public class StringWrapper
{
    public string Text { get; set; }

    public StringWrapper()
    {
        Text = string.Empty;
    }

    public StringWrapper(string text)
    {
        Text = text;
    }
}

当我在TextBox中输入时,我试图这样做,在StringWrapper绑定到当前聚焦的TextBox之后,我在我的ObservableCollection中插入一个StringWrapper,它会生成一个新的TextBox。到目前为止,我的代码都是这样做的,尽管有一些问题需要解决。

我的问题是,如何将焦点设置为新生成的TextBox?据我所知,控件生成发生在插入字符串返回的函数之后。

我找了类似ItemsControl.ItemsSourceChanged事件的东西,但至少,这个名字并不存在。我还尝试将处理程序附加到ObservableCollection.CollectionChanged,但是在生成TextBox之前似乎也是如此。最后,由于ItemsControl.Template是一个StackPanel,我找了一个StackPanel.ControlAdded事件,但是找不到它。

想法?谢谢!

1 个答案:

答案 0 :(得分:0)

您可能需要处理CollectionChanged,然后使用优先级为Dispatcher.BeginInvoke的{​​{1}}安排重点操作。这应该为Loaded提供生成容器和执行布局的机会。