.net 如何在ItemsControl中检索项的DataTemplate(和特定对象)?

.net 如何在ItemsControl中检索项的DataTemplate(和特定对象)?,.net,wpf,datatemplate,itemscontrol,.net,Wpf,Datatemplate,Itemscontrol,我已经看到了一个非常类似的问题的解决方案,但它并没有转化为我的。(即本文:) My ItemsControl绑定到可观察的集合,该集合可以动态添加项 当我向observable集合添加一个项时,模板化的项在我的itemscontrol中正确呈现,但我不知道如何访问它。我的可观察的同事更改了代码,我正在尝试访问有关的信息。我使用自定义DataTemplateSelector根据集合中项目的数据返回3个不同dataTemplates中的一个 以下是我的ItemsControl XAML的概要: &l

我已经看到了一个非常类似的问题的解决方案,但它并没有转化为我的。(即本文:)

My ItemsControl绑定到可观察的集合,该集合可以动态添加项

当我向observable集合添加一个项时,模板化的项在我的itemscontrol中正确呈现,但我不知道如何访问它。我的可观察的同事更改了代码,我正在尝试访问有关的信息。我使用自定义DataTemplateSelector根据集合中项目的数据返回3个不同dataTemplates中的一个

以下是我的ItemsControl XAML的概要:

<ItemsControl Name="myItemsControl" ItemTemplateSelector="{StaticResource myTempSelector}">
    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <ItemsPresenter/>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel></StackPanel>   
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    </ItemsControl>

我看到的解决方案建议使用
ItemContainerGenerator.ContainerFromItem(xxx)

在本例中,他们总是在查找有关ListBox或ComboBox(继承自ContentControl)的信息。但是,当我调用(在我的代码隐藏中)myItemsControl.ItemContainerGenerator.ContainerFromItem(xxx)时,我会收到一个ContentPresenter,而不是我期望的ContentControl

然后,当我尝试访问这个ContentPresenter的ContentTemplate时,我得到一个空对象异常

我有一种预感,我其余的麻烦都是从那里来的

我只想在新创建的控件中从datatemplate中找到一个文本框,并赋予它焦点


救命!:-)

您需要获取DataTemplate本身的句柄,并使用其FindName方法,引用项的父控件

例如:

var item = myItemsControl.ItemContainerGenerator.ContainerFromItem(xxx);
var template = this.Resources["MyItemTemplate"] as DataTemplate;
var ctl = template.FindName("textBox1", item) as FrameworkElement;
因此,它会在该项中找到一个名为“textBox1”的控件

如果您没有使用命名的DataTemplate(即带有x:Key=“MyItemTemplate”的DataTemplate),而是使用DataType=“…”定义要用于特定类型的DataTemplate,则查找模板的方法会略有变化:

var actionKey = new DataTemplateKey(typeof(MyCustomClass));
var actionTemplate = Resources[actionKey] as DataTemplate;

谢谢你的快速帮助。我使用的是命名模板,如第一个示例中所示。(忘了提到我正在使用visual basic,顺便说一句)Dim myCp作为ContentPresenter=SP_ItemsControl.ItemContainerGenerator.ContainerFromItem(_ObsCol.ElementAt(newIndex))Dim template作为DataTemplate=Me.FindResource(“RNQuestionTemplate”)Dim ctl作为BindableRTB=template.FindName(“myRTB”,myCp)ctl.Focus()我在最后一行的下一行遇到以下错误:“此操作仅对应用了此模板的元素有效。”但是,这是应用了该模板的项!?!:-)哈哈!它正在工作。再次感谢你的帮助。最后我的问题是,我试图在项目上实际设置DataTemplate之前获取它。我不知道为什么会发生这样的事情,但我只是想知道发生的时间。