2010-12-14 5 views
4

Je sais qu'il ya ce fil: How to find a resource in a UserControl from a DataTemplateSelector class in WPF?WPF: Trouver des ressources de UserControl au sein DataTemplateSelector classe

demander la même chose.

MAIS ... Je ne suis pas satisfait de la réponse! Il doit y avoir un moyen de saisir les ressources du

UserControl contenant le ContentControl/présentateur déclarant ceci:

ContentTemplateSelector="{StaticResource MySelector}" 

Chaque dérivé DataTemplateSelector classe d'un paramètre dans sa SelectedTemplate Method =>

de récipient

qui est typeof DependencyObject.

Bien conteneur est dans mon cas le contentcontrol.

Ne serait-il pas possible de monter l'arborescence visuelle en commençant par "contentcontrol" et d'essayer pour obtenir le UserControl via FindAncestor?

Répondre

10

Oui, vous pouvez lancer le paramètre container-FrameworkElement et appeler FindResource faire une recherche de ressources à partir de l'ContentPresenter. Par exemple:

code:

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

œuvres !!! Je mets aussi ta solution dans l'autre thread avec la mauvaise solution alors peut-être que tu auras plus de points ;-) – Elisabeth

Questions connexes