2009-07-17 12 views
5

ich eine ContentControl abgeleitete Kontrolle zu bauen bin versucht, (lass es MyContentControl nennen), die seine ControlTemplate durch eine Instanz eines DataTemplateSelector abgeleiteten Typs eingestellt haben (lassen Anruf des es MyTemplateSelector).WPF DataTemplateSelector.SelectTemplate nicht für einen Contentcontrol-abgeleiteten Typen namens

Wenn ich versuche dies:

ContentControl contentControl = new ContentControl(); 
contentControl.ContentTemplateSelector = new MyTemplateSelector(); 
contentControl.Content = "Some ContentControl Content"; 

MyContentControl myContentControl = new MyContentControl();  
myContentControl.ContentTemplateSelector = new MyTemplateSelector(); 
myContentControl.Content = "Some MyControl Content"; 

erwarte ich, dass, wenn ich Inhalte auf diesen Kontrollen festgelegt, MyTemplateSelector Überschreibung s‘von DataTemplateSelector.SelectTemplate() Methode für beide contentControl und myContentControl aufgerufen wird.

In Wirklichkeit wird es nur für contentControl aufgerufen. Was muss ich tun (und warum?), Damit es auch für myContentControl funktioniert?

(nicht sicher, ob es relevant ist, aber für den Moment MyContentControl tut nichts mit DependencyProperties andere als DefaultStyleKeyProperty für Metadaten-Informationen überschrieben

EDIT (Inhalte aus anderen Post ursprüngliche Frage bewegt).

ist hier etwas aufwendigere Beispiel:

  1. MyContentControl erstellen:

    public class MyContentControl : ContentControl 
    { 
        static MyContentControl() 
        { 
        DefaultStyleKeyProperty.OverrideMetadata(typeof (MyContentControl), 
                 new FrameworkPropertyMetadata(typeof (MyContentControl))); 
        } 
        public MyContentControl() {} 
    } 
    
  2. erstellen MyTemplateSelector:

    public class MyTemplateSelector : DataTemplateSelector 
    { 
        public override DataTemplate SelectTemplate(object item, DependencyObject container) 
        { 
        return null; // <== Place the breakpoint here 
        } 
    } 
    
  3. hinzufügen ContentControl und MyContent Kontrolle zu Ihrem Hauptfenster (zum Beispiel):

    <StackPanel> 
        <local:MyContentControl x:Name="myContentControl" /> 
        <ContentControl x:Name="contentControl" /> 
    </StackPanel> 
    
  4. diesen Code hinzufügen irgendwo nach InitializeComponent (oder in Loaded Handler):

    myContentControl.ContentTemplateSelector = new MyTemplateSelector(); 
    myContentControl.Content = "123"; 
    
    contentControl.ContentTemplateSelector = new MyTemplateSelector(); 
    contentControl.Content = "ABC"; 
    

Der Haltepunkt in Schritt (2) genannten nur einmal getroffen wird, für content="ABC" und contentControl Element.

Antwort

0

Sie müssen möglicherweise mehr von Ihrem Code, weil ich nur ein einfaches Beispiel erstellt und es hat gut funktioniert. Meine DataTemplate enthält nur eine TextBox, meine DataTemplateSelector gibt immer diese DataTemplate zurück, und sowohl eine ContentControl als auch eine von ContentControl abgeleitete Klasse verwenden meine DataTemplateSelector. In beiden Fällen wurde TextBox angezeigt.

2

Ich habe das gleiche Problem vor, und ich löse es mit diesem (Notify DataTemplateSelector about the change) Hinweis.

Mein Problem war, ich möchte eine ContentPresenter, die eingebettete UserControl ändert, wenn die ComboBox-Auswahl geändert.

der Combobox + Content XAML ist

 <ComboBox Name="comboBoxControl" Grid.Row="1" Grid.Column="1" SelectionChanged="comboBox_SelectionChanged"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <cmd:EventToCommand Command="{Binding Path=ChangeControlCommand, Mode=OneWay}" CommandParameter="{Binding Path=SelectedItem.Content, ElementName=comboBoxControlType}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
     <ComboBoxItem>UserControl-1-</ComboBoxItem> 
     <ComboBoxItem>UserControl-2-</ComboBoxItem> 
    </ComboBox> 
<ContentPresenter Name="contentPresenter" ContentTemplateSelector="{Binding Source={StaticResource controlCueTemplateSelector}}" 
         Content="{Binding}" /> 

Wie Sie mein Ansatz die Befehlsbindung mit MVVM Weise sehen können, war. Auch wenn Sie keinen Code-Behind schreiben möchten, schreiben Sie bitte einen Code-Behind mit dem entsprechenden Event wie unten beschrieben.

Bottomline ist, müssen Sie das gebundene Zielobjekt (in meinem Fall die Content-Eigenschaft) zurücksetzen.

2

Ich hatte gerade das gleiche Problem und der Grund, dass der DataTemplateSelector für ein ContentControl angewendet wurde, aber nicht für meine abgeleitete Control wurde in der ControlTemplate für meine abgeleitete Control ausgeblendet. Ich habe vergessen, einfach die Vorlage hinzuzufügen, für die ContentTemplateSelector Bindung:

<ControlTemplate TargetType="{x:Type local:UniControl}"> 
<Border Background="{TemplateBinding Background}" 
     BorderBrush="{TemplateBinding BorderBrush}" 
     BorderThickness="{TemplateBinding BorderThickness}"> 
    <ContentPresenter Content="{TemplateBinding Content}" 
         ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}"/> 
</Border> 

Hoffnung, das hilft.

+0

Danke. Das hat mir einige Münzen gerettet. – dotNET