访问DataTemplate中的元素...如何使用多个DataTemplate?

时间:2010-06-12 08:17:08

标签: wpf vb.net datatemplate findname

我为Listbox Control定义了2个DataTemplates。 1模板用于UnSelected State,另一个用于Selected State(显示比UnSelected State更多的详细信息)。

我跟着这个例子:

http://blogs.msdn.com/b/wpfsdk/archive/2007/04/16/how-do-i-programmatically-interact-with-template-generated-elements-part-ii.aspx

关于如何从Code后面访问DataTemplates中的Elements。

我做对了,但它只找到并返回UnSelected DataTemplate的一个元素。但是当我在Selected DataTemplate中搜索一个元素时,我得到一个NullReferenceException。

我可能做错了什么?

2 个答案:

答案 0 :(得分:3)

设置键盘焦点可能是您需要访问datatemplate元素的一个原因。 MVVM无法解决该问题,并且FocusManager不会设置键盘焦点。

答案 1 :(得分:1)

你做错了什么?

我会说你做错了是试图从代码隐藏中访问DataTemplate中的元素。顽皮,顽皮!

所有开玩笑,99.9%的时间我看到有人试图从代码中访问DataTemplate中的元素,这是因为他们的应用程序设计很差,没有(或很少)绑定,根本没有视图模型。许多初学者倾向于将他们的数据直接存储在UI元素中,而不是使用视图模型。我认为这是因为他们的思想已被VB,WinForms和ASP.NET体验所破坏,这是“正常”的方式。有一千个理由使用视图模型并绑定您的数据,而不是将它们存储在UI元素中。在线查找“模型视图视图模型”以获取更多详细信息。

现在回答你的问题:

任何给定的ListBoxItem一次只能有一个DataTemplate。这是因为其ContentPresenter只有一个ContentTemplate属性,并且此属性不能有两个不同的值。

因此,ListBoxItem下的可视树将始终从一个特定模板生成,而不是由多个模板的组合生成。如果更改ListBox的ItemTemplate或以其他方式更新ListBoxItem.ContentTemplate,旧模板生成的可视树将被丢弃并构建一个新的。

让我再说一遍:如果您更改数据模板,将丢弃旧数据模板生成的可视化树,并构建新的可视树

您可以在给定的ListBoxItem上定义和使用一百个数据模板,但一次只能有一个数据模板可以为其实例化一个可视化树。这些是作为可视树的一部分实际存在的唯一元素。所有其他模板仅作为模板存在 - 没有为它们创建实际元素。

换句话说:询问如何在同一控件上由两个不同模板实例化的两个不同的可视树中查找元素是没有意义的,因为单个控件不能同时激活两个不同的模板。 / p>

希望这能为你解决问题。

最后建议:阅读MVVM,并停止尝试尽快访问DataTemplates内的元素。但是,如果您认为您可能有0.1%的人确实有正当理由访问模板中的元素,请回写您想要这样做的实际原因,也许我可以提供进一步的指导。