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

Mat*_* H. 4 .net wpf datatemplate itemscontrol

我已经看到了一个非常类似的问题的解决方案,但它没有转化为我的.(即,这篇文章:http://blogs.msdn.com/wpfsdk/archive/2007/04/16/how-do-i-programmatically-interact-with-template-generated-elements-part-ii.aspx)

我的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>
Run Code Online (Sandbox Code Playgroud)

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

在这个例子中,他们总是在寻找有关ListBox或ComboBox(从ContentControl继承)的信息.但是,当我调用(在我的代码后面)时myItemsControl.ItemContainerGenerator.ContainerFromItem(xxx),我会收到一个ContentPresenter,而不是我期望的ContentControl.

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

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

我想要做的就是从我新创建的控件中的datatemplate中找到一个文本框,并给它重点.

救命!:-)

Mat*_*ton 5

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

例如:

var item = myItemsControl.ItemContainerGenerator.ContainerFromItem(xxx);
var template = this.Resources["MyItemTemplate"] as DataTemplate;
var ctl = template.FindName("textBox1", item) as FrameworkElement;
Run Code Online (Sandbox Code Playgroud)

所以这会在项目中找到一个名为"textBox1"的控件.

如果您没有使用命名的DataTemplate(即使用x:Key ="MyItemTemplate"),而是使用DataType ="..."来定义要用于特定类型的DataTemplate,则可以使用该方法查找模板略有变化:

var actionKey = new DataTemplateKey(typeof(MyCustomClass));
var actionTemplate = Resources[actionKey] as DataTemplate;
Run Code Online (Sandbox Code Playgroud)