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

4
我看到了一些与我的问题非常相似的解决方案,但并不能适用于我的情况。(具体而言,请参考这篇文章:http://blogs.msdn.com/wpfsdk/archive/2007/04/16/how-do-i-programmatically-interact-with-template-generated-elements-part-ii.aspx
我的ItemsControl绑定了一个可观察集合,其中可以动态添加项目。
当我向可观察集合中添加一个项目时,模板化的项目会正确呈现在我的itemscontrol中,但我无法弄清楚如何访问它。在我的可观察集合更改代码中,我正在尝试访问有关信息。我使用自定义DataTemplateSelector根据集合中项的数据返回3种不同的数据模板之一。
以下是我的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中找到一个文本框,并将其聚焦。
帮帮忙吧! :-)
1个回答

5
你需要获取DataTemplate本身的句柄,并使用其FindName方法,引用你的项的父控件。
例如:
var item = myItemsControl.ItemContainerGenerator.ContainerFromItem(xxx);
var template = this.Resources["MyItemTemplate"] as DataTemplate;
var ctl = template.FindName("textBox1", item) as FrameworkElement;

这将在项中查找名为"textBox1"的控件。

如果您不使用具有x:Key="MyItemTemplate"属性的命名的DataTemplate,而是使用DataType="..."来定义用于特定类型的DataTemplate,则查找模板的方法略有不同:

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

感谢您的快速帮助。我正在使用命名模板,就像您的第一个示例一样。(顺便提一下,我正在使用Visual Basic)Dim myCp As ContentPresenter = SP_ItemsControl.ItemContainerGenerator.ContainerFromItem(_ObsCol.ElementAt(newIndex))Dim template As DataTemplate = Me.FindResource("RNQuestionTemplate") Dim ctl As BindableRTB = template.FindName("myRTB", myCp) ctl.Focus()在倒数第二行,我遇到了以下错误: “此操作仅对已应用此模板的元素有效。”但是,这是一个应用了该模板的项目!? :-) - Matt H.
啊哈!现在它可以工作了。再次感谢您的帮助。我的问题最后是我试图在项目实际设置DataTemplate之前获取它。我不知道为什么会发生这种情况,但我只能围绕那个时间进行调整。 - Matt H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接