2010-12-14 6 views
4

ich weiß, dass es dieses Threads: How to find a resource in a UserControl from a DataTemplateSelector class in WPF?WPF: Finden Sie Ressourcen von Usercontrol in Datatemplateselector Klasse

fragt das gleiche.

ABER ... Ich bin nicht mit der Antwort zufrieden! Es muss ein Weg sein, die Ressourcen der dies den Content/Moderator erklärt enthalten

Benutzersteuerelement zu greifen:

ContentTemplateSelector="{StaticResource MySelector}" 

Jede abgeleitete DataTemplateSelector Klasse einen Parameter in seinem SelectedTemplate Method =>

Behälter, ist typeof DependencyObject.

Gut Container ist in meinem Fall die Inhaltskontrolle.

Wäre es nicht möglich, den visuellen Baum ab "contentcontrol" zu klettern und zu versuchen, das UserControl über FindAncestor zu erhalten?

Antwort

10

Ja, können Sie den container Parameter FrameworkElement gegossen und FindResource rufen am ContentPresenter Starten einer Ressourcensuche zu tun. Zum Beispiel:

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

Werke !!! Ich lege deine Lösung auch in den anderen Thread mit der schlechten Lösung, damit du vielleicht mehr Punkte bekommst ;-) – Elisabeth

Verwandte Themen