ElementName не работает при назначении DataTemplate из кода позади?

Я пытаюсь получить доступ к элементу управления, используя ElementName из DataTemplate, который используется в другом UserControl (ресурсы), чем определено (в 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 я устанавливаю ContentTemplate ContentPresenter из MyUserControl.xaml:

что-то вроде:

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

Можно ли использовать ElementName из ресурсов, которые определены вне UserControl?

Как DataTemplate ищет ElementName в том же UserControl тогда? Может быть, возможно установить что-то вроде DataContext для самого DataTemplate, чтобы ElementName работал, не связываясь с DataContext, который отправляется элементам управления, используемым внутри Template?

2 ответа

Вам необходимо пересмотреть понятия, связанные с именными областями.

Вкратце, имена ограничиваются областью загрузки ресурсов Xaml. Например, каждый UserControl будет загружать свой собственный Xaml и, следовательно, иметь свою собственную область имен. В вашем случае вы спрашиваете MyUserControlWrapper найти имя, которое его LoadComponent не видел.

Может быть, вы можете просто пройтись по VisualTree, используя RelativeSource и FindAncestor? Здесь представлена ​​хорошая презентация различных вариантов привязки: http://www.wpfwiki.com/Default.aspx?Page=WPF%20Q5.3&AspxAutoDetectCookieSupport=1

Другие вопросы по тегам