【问题标题】:WPF: Get control TextBox at ItemControlWPF:在 ItemControl 处获取控件 TextBox
【发布时间】:2018-11-28 14:34:35
【问题描述】:

我在 ItemsControl 中有一个 ObservableCollection 绑定。在这个 ItemsControl 中创建了一些 TextBoxes,ObservableCollection 中的每个对象一个。

现在我需要选择文本并根据所选对象突出显示它,但我无法做到。

我的xml:

<StackPanel x:Name="stackPanel">
    <StackPanel.Children>
        <ItemsControl x:Name="itemsControl" ItemsSource="{Binding MyCollection}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding MyContent}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel.Children>
</StackPanel>

这是我的代码,被一个事件调用:

for (int i = 0; i < this.stackPanel.Children.Count; i++)
{
    TextBox t = this.stackPanel.Children[i] as TextBox;
    if (t != null)
    {
        // do selection
    }
}

// and also in this way:
for (int i = 0; i < itemsControl.Items.Count; i++)
{
    UIElement uiElement =
       (UIElement)itemsControl.ItemContainerGenerator.ContainerFromIndex(i);

    TextBox t2 = (uiElement as TextBox);
    if (t2 != null)
    {
        // do selection
    }
}

我怎样才能得到这些文本框? 谢谢。

【问题讨论】:

  • 我的建议是尽量避免直接操作 UI,将它们绑定到一个对象并修改该对象
  • 这不是我所需要的,但给了我一个解决它的想法。谢谢

标签: c# wpf itemscontrol


【解决方案1】:

以下代码选择索引i处的一个文本框:

ContentPresenter c = (ContentPresenter)itemsControl.ItemContainerGenerator.ContainerFromIndex(i);
TextBox t2 = c.ContentTemplate.FindName("textboxName", c) as TextBox;

if (t2 != null)
{
    t2.Focus();
    t2.SelectAll();
}

您必须在 xaml 中命名您的文本框:

<TextBox x:Name="textboxName" ....

请注意,您一次不能聚焦超过 1 个元素,因此无法通过这种方式突出显示所有元素。您必须手动更改突出显示的文本颜色(通过绑定或代码)

【讨论】:

  • ItemControl 中不可能命名控件 :(
  • 现在我明白了。我不知道我是什么错误。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
相关资源
最近更新 更多