gpt4 book ai didi

未针对 ContentControl 派生类型调用 WPF DataTemplateSelector.SelectTemplate

转载 作者:行者123 更新时间:2023-12-02 00:25:17 26 4
gpt4 key购买 nike

我正在尝试构建一个 ContentControl -派生控件(我们称之为 MyContentControl ),它将有其 ControlTemplateDataTemplateSelector 的实例设置-派生类型(我们称之为 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";

我预计,当我在这些控件上设置内容时,MyTemplateSelector覆盖DataTemplateSelector.SelectTemplate() contentControl 都调用方法和myContentControl .

实际上,只有 contentControl 才会调用它。我需要做什么(以及为什么!)才能使其适用于 myContentControl也是吗?

(不确定它是否相关,但目前 MyContentControl 不会对 DependencyProperties 执行任何操作,除了覆盖 DefaultStyleKeyProperty 的元数据信息。

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

这是一个更详细的示例:

  1. 创建 MyContentControl:

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

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

    <StackPanel>
    <local:MyContentControl x:Name="myContentControl" />
    <ContentControl x:Name="contentControl" />
    </StackPanel>
  4. 将此代码添加到 InitializeComponent 之后的某个位置(或在Loaded处理程序中):

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

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

步骤 (2) 中提到的断点仅被击中一次,即 content="ABC"contentControl元素。

最佳答案

我之前也遇到过同样的问题,我用这个(Notify DataTemplateSelector about the change)提示解决了它。

我的问题是,我想要一个 ContentPresenter,它可以在 ComboBox 选择更改时更改嵌入的 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方式绑定(bind)是我的做法。尽管您可能不想编写隐藏代码,但请编写带有适当事件的隐藏代码,如下所示。

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

底线是,您需要重置绑定(bind)的目标对象(在我的例子中是 Content 属性)。

关于未针对 ContentControl 派生类型调用 WPF DataTemplateSelector.SelectTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1141818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com