WPF DataTemplateSelector.SelectTemplate is not called for type ContentControl

I'm trying to create a ContentControl-derived element (let it be called MyContentControl) that will have its own ControlTemplate, given an instance of the DataTemplateSelector-derived type (call it MyTemplateSelector).

When I try to do this:

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";

I expect that when I set the content for these controls, it MyTemplateSelectoroverrides the method DataTemplateSelector.SelectTemplate()invoked for ContentControlboth and MyContentControl.

In fact, it is called only for contentControl. What do I need to do (and why!) So that it works for MyContentControltoo?

(Not sure if this is relevant, but currently MyContentControldoes nothing with DependencyProperties, except overriding metadata information for DefaultStyleKeyProperty.

EDIT ( ):

:

  • MyContentControl:

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

    public class MyTemplateSelector : DataTemplateSelector
    {
      public override DataTemplate SelectTemplate(object item, DependencyObject container)
      {
        return null;  // <== Place the breakpoint here
      }
    }
    
  • ContentControl MyContent ():

    <StackPanel>
        <local:MyContentControl x:Name="myContentControl" />
        <ContentControl x:Name="contentControl" />
    </StackPanel>
    
  • - InitializeComponent ( Loaded):

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

, (2), , content="ABC" ContentControl.

+5
3

, (Notify DataTemplateSelector ).

, , ContentPresenter UserControl ComboBox.

+ ContentPresenter XAML

        <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}" />

, MVVM . , , , , .

    private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var content = contentPresenter.Content;
        contentPresenter.ClearValue(ContentPresenter.ContentProperty);
        contentPresenter.SetValue(ContentPresenter.ContentProperty, content);
    }

, reset ( - Content).

+2

, , DataTemplateSelector ContentControl, , ControlTemplate . ContentTemplateSelector:

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

, .

+2

You may need to post more code because I just created a simple example and it worked great. Mine DataTemplateonly contains TextBoxmine, it DataTemplateSelectoralways returns this DataTemplate, and both the ContentControlclass derived from ContentControluse mine DataTemplateSelector. In both cases, a symbol was displayed TextBox.

0
source

All Articles