没有为ContentControl派生类型调用WPF DataTemplateSelector.SelectTemplate

use*_*759 6 wpf datatemplate datatemplateselector

我正在尝试构建一个ContentControl派生的控件(让我们称之为MyContentControl),它将ControlTemplate由一个DataTemplateSelector-derived类型的实例设置(让我们称之为MyTemplateSelector).

当我尝试这个:

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";
Run Code Online (Sandbox Code Playgroud)

我希望,当我在这些控件上设置内容时,会同时调用方法MyTemplateSelector的覆盖和 .DataTemplateSelector.SelectTemplate()contentControlmyContentControl

实际上,只为contentControl调用它.我需要做什么(以及为什么!)才能使其发挥作用myContentControl

(不确定它是否相关,但目前除了覆盖元数据信息之外MyContentControl没有做任何DependencyProperties其他事情DefaultStyleKeyProperty.

编辑(将内容从其他帖子转移到原始问题):

这是一个更详细的例子:

  1. 创建MyContentControl:

    public class MyContentControl : ContentControl
    {
      static MyContentControl()
      {
        DefaultStyleKeyProperty.OverrideMetadata(typeof (MyContentControl),
                                             new FrameworkPropertyMetadata(typeof (MyContentControl)));
      }
      public MyContentControl() {}
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建MyTemplateSelector:

    public class MyTemplateSelector : DataTemplateSelector
    {
      public override DataTemplate SelectTemplate(object item, DependencyObject container)
      {
        return null;  // <== Place the breakpoint here
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加ContentControlMyContent控制主窗口(例如):

    <StackPanel>
        <local:MyContentControl x:Name="myContentControl" />
        <ContentControl x:Name="contentControl" />
    </StackPanel>
    
    Run Code Online (Sandbox Code Playgroud)
  4. InitializeComponent(或Loaded处理程序)之后的某处添加此代码:

    myContentControl.ContentTemplateSelector = new MyTemplateSelector();
    myContentControl.Content = "123";
    
    contentControl.ContentTemplateSelector = new MyTemplateSelector();
    contentControl.Content = "ABC";
    
    Run Code Online (Sandbox Code Playgroud)

步骤(2)中提到的断点仅被触发一次,用于content="ABC"contentControl元素.

And*_*ndy 0

您可能需要发布更多代码,因为我刚刚创建了一个简单的示例并且它运行良好。MyDataTemplate只包含 a TextBox, myDataTemplateSelector总是返回该值DataTemplate,并且 a和派生自使用 my 的ContentControl类都可以。在这两种情况下都显示了a 。ContentControlDataTemplateSelectorTextBox