从代码后面分配DataTemplate时,ElementName无法正常工作?

时间:2010-07-09 12:30:38

标签: silverlight binding resources user-controls datatemplate

我正在尝试使用DataTemplate中的ElementName访问Control,该DataName在不同的UserControl(Resources)中使用,而不是在定义的(在xaml中)。

想象一下这种情况:

MyUserControl.xaml,资源中包含以下DataTemplate:

<UserControl.Resources>
   <DataTemplate x:Key="SomeTemplate">
      <TextBlock Text="{Binding Text, ElementName=TextElement}"/>
   </DataTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
    <TextBlock x:Name="TextElement" Text="IT WORKS! (not...)"/>
</Grid>
</UserControl>

MyUserControlWrapper.xaml

<ContentPresenter x:Name="ContentPresenter" Content="{Binding SomeContent}"/>

在MyUserControlWrapper.xaml的代码后面我从MyUserControl.xaml设置了ContentPresenter的ContentTemplate:

类似的东西:

ContentPresenter.ContentTemplate = (DataTemplate)childView.Resources["SomeTemplate"];

是否可以在UserControl外部定义的资源中使用ElementName?

DataTemplate如何在同一个UserControl中搜索ElementName呢?也许可以设置类似DataConmplate的DataContext本身,以使ElementName工作,而不会弄乱发送给模板内部使用的控件的DataContext?

2 个答案:

答案 0 :(得分:1)

您需要查看与Namescopes相关的概念。

简要说明名称的范围是加载Xaml资源的位置。例如,每个UserControl都会加载自己的Xaml,因此拥有自己的名称范围。在您的情况下,您要求MyUserControlWrapper找到其LoadComponent未见过的名称。

答案 1 :(得分:0)

也许你可以使用RelativeSource和FindAncestor走上VisualTree? 这里有一个很好的不同绑定变体的演示: http://www.wpfwiki.com/Default.aspx?Page=WPF%20Q5.3&AspxAutoDetectCookieSupport=1