2010-12-14 3 views
4

Я знаю, что есть эта нить: How to find a resource in a UserControl from a DataTemplateSelector class in WPF?WPF: Найти ресурсы от UserControl в DataTemplateSelector класса

просить то же самое.

НО ... Я не удовлетворен ответом! Должен быть способ, чтобы захватить ресурсы

UserControl, содержащего ContentControl/Presenter заявляют, что это:

ContentTemplateSelector="{StaticResource MySelector}" 

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

контейнер, который typeof DependencyObject.

Ну контейнер в моем случае contentcontrol.

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

ответ

10

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

работы !!! Я поставил ваше решение в другой поток с плохим решением, так что, может быть, вы получите больше очков ;-) – Elisabeth