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.
编辑(将内容从其他帖子转移到原始问题):
这是一个更详细的例子:
创建MyContentControl:
public class MyContentControl : ContentControl
{
static MyContentControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof (MyContentControl),
new FrameworkPropertyMetadata(typeof (MyContentControl)));
}
public MyContentControl() {}
}
Run Code Online (Sandbox Code Playgroud)创建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)添加ContentControl和MyContent控制主窗口(例如):
<StackPanel>
<local:MyContentControl x:Name="myContentControl" />
<ContentControl x:Name="contentControl" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)在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元素.
您可能需要发布更多代码,因为我刚刚创建了一个简单的示例并且它运行良好。MyDataTemplate只包含 a TextBox, myDataTemplateSelector总是返回该值DataTemplate,并且 a和派生自使用 my 的ContentControl类都可以。在这两种情况下都显示了a 。ContentControlDataTemplateSelectorTextBox