在带有文本框的列表框中,如何关注添加的文本框?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在带有文本框的列表框中,如何关注添加的文本框?相关的知识,希望对你有一定的参考价值。

我有一个文本框列表框和一个将新项添加到列表框的按钮。当我单击添加按钮时,我希望选择新项,并希望包含的文本框具有焦点。

我可以通过绑定轻松地选择新项目,但是我还没有弄清楚如何集中显示文本框。我无法从视图模型中完成此操作,因为直到稍后才创建新的文本框。

为了向您展示问题,我创建了一个示例解决方案(在GitHub上提供:TestListBoxWithTextBox)。

这里是XAML:

<Window
    x:Class="TestListBoxWithTextBox.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow"
    >
    <StackPanel>
        <ListBox
            ItemsSource="{Binding Items}"
            SelectedItem="{Binding SelectedItem}"
            >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Name}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button
            Content="Add"
            Command="{Binding AddItemCommand}"
            />
    </StackPanel>
</Window>

这是我的视图模型(ViewModelBase来自MVVM Light Toolkit):

public class MainViewModel : ViewModelBase
{
    public ObservableCollection<ItemViewModel> Items { get; } =
        new ObservableCollection<ItemViewModel>();

    private ItemViewModel selectedItem;
    public ItemViewModel SelectedItem
    {
        get => selectedItem;
        set => Set(nameof(SelectedItem), ref selectedItem, value);
    }

    public ICommand AddItemCommand =>
        new RelayCommand(() =>
        {
            var newItem = new ItemViewModel();
            Items.Add(newItem);
            SelectedItem = newItem;
        });
}

public class ItemViewModel : ViewModelBase
{
    private string name;
    public string Name
    {
        get => name;
        set => Set(nameof(Name), ref name, value);
    }
}

我尝试过的事情

与视图模型对话:我用方法IView创建了一个接口FocusTextBox(int index)。视图实现了此接口,并且视图模型在选择新项之后(在AddItemCommand中)调用了其方法。但是,即使我将新项添加到TextBox列表中,该视图也无法找到Items,因为它尚不存在。

TextBox放在其Loaded事件上: Loaded事件可确保TextBox存在,因此尝试在此处获得焦点是有意义的。这在这个简单的示例中有效,但在我的实际程序中无效。在我的程序中,当您在TextBox中输入内容然后按添加按钮时,焦点从文本框移开,然后该文本框调用单独的命令对项目进行排序。在排序过程中,一些文本框被移动,这将导致其Loaded事件被调用,然后该事件会从添加按钮中窃取焦点,因此其行为就像从未按下添加按钮一样。]

TextBox放在ListBox.ItemContainingGenerator.StatusChanged上:

当列表框中的所选项目发生更改时,我将收听ItemContainingGenerator.StatusChanged事件。当列表框中的项目正在生成或完成生成时,将引发此事件。当它们完成生成后,我在所选项目(在视图模型中设置)内找到TextBox并专注于此。此解决方案有效,但不一致。在我的某些列表框中,这不起作用,我不确定为什么。

我有一个文本框列表框和一个将新项添加到列表框的按钮。当我单击添加按钮时,我希望选择新项,并希望包含的文本框具有焦点。我...

答案

我已经对您的代码进行了微小的更改..,我认为它可以工作...

以上是关于在带有文本框的列表框中,如何关注添加的文本框?的主要内容,如果未能解决你的问题,请参考以下文章

从其他窗口将新项目添加到列表框

MS Access - 带有组合框和文本框的 If 语句

MVVM:将带有 Observable 集合的命令绑定到 Listbox 并从文本框中获取值

MS Access 2013 - 根据文本框中的值过滤列表框中的值

如何在文本框中选择文本?

如果文本框中没有文本,jQuery 自动完成返回空列表