WPF: поиск ресурсов из UserControl в классе DataTemplateSelector - PullRequest
5 голосов
/ 15 декабря 2010

Я знаю, что есть эта тема: Как найти ресурс в UserControl из класса DataTemplateSelector в WPF?

спрашиваю то же самое.

НО ... Я не удовлетворен ответом! ДОЛЖЕН быть способ получить ресурсы

UserControl, содержащий ContentControl / Presenter, декларирующий это:

ContentTemplateSelector="{StaticResource MySelector}" 

Каждый производный DataTemplateSelector класс имеет параметр в своем SelectedTemplate Method =>

контейнер, который является typeof DependencyObject.

В моем случае контейнер с содержимым - это управление контентом.

Было бы невозможно взобраться на визуальное дерево, начиная с «contentcontrol», и попробовать получить UserControl через FindAncestor?

1 Ответ

12 голосов
/ 15 декабря 2010

Да, вы можете привести параметр 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>
...