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