WPF: поиск ресурсов из UserControl в классе DataTemplateSelector
Я знаю, что есть эта тема: Как найти ресурс в UserControl из класса DataTemplateSelector в WPF?
спрашиваю то же самое.
НО... Я не удовлетворен ответом! ДОЛЖЕН быть способ захватить ресурсы
UserControl, содержащий ContentControl/Presenter, декларирующий это:
ContentTemplateSelector="{StaticResource MySelector}"
Каждый производный DataTemplateSelector
Класс параметр в его SelectedTemplate
Метод =>
контейнер, который является typeof DependencyObject.
Ну контейнер в моем случае - это управление контентом.
Разве нельзя было бы взобраться на визуальное дерево, начиная с "contentcontrol", и попытаться получить UserControl через FindAncestor?
1 ответ
Решение
Да, вы можете разыграть container
параметр для FrameworkElement
и вызвать FindResource для поиска ресурса, начиная с ContentPresenter
, Например:
Код:
public class MySelector
: DataTemplateSelector
{
public override DataTemplate SelectTemplate
(object item, DependencyObject container)
{
// Determine the resource key to use
var key = item.ToString() == "a" ? "one" : "two";
// Find the resource starting from the container
return ((FrameworkElement)container).FindResource(key) as DataTemplate;
}
}
XAML:
<UserControl
x:Class="WpfApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
>
<UserControl.Resources>
<DataTemplate x:Key="one">
<TextBlock>Template One</TextBlock>
</DataTemplate>
<DataTemplate x:Key="two">
<TextBlock>Template Two</TextBlock>
</DataTemplate>
<local:MySelector x:Key="MySelector"/>
</UserControl.Resources>
<StackPanel>
<ContentPresenter
ContentTemplateSelector="{StaticResource MySelector}"
Content="a"/>
<ContentPresenter
ContentTemplateSelector="{StaticResource MySelector}"
Content="b"/>
</StackPanel>
</UserControl>