.net ContentPresenter中的RelativeSource返回null

.net ContentPresenter中的RelativeSource返回null,.net,wpf,.net,Wpf,我的问题可以简化为以下示例: <TabControl> <TabItem Header="first"> <Button Content="TestButton" /> </TabItem> <TabItem Header="second"> <ContentPresenter > <ContentPresenter.Content>

我的问题可以简化为以下示例:

<TabControl>
    <TabItem Header="first">
        <Button Content="TestButton" />
    </TabItem>

    <TabItem Header="second">
        <ContentPresenter >
            <ContentPresenter.Content>
                <Button x:Name="button" 
                        CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=TabControl}}" 
                        Content="CommandParameter is null" Click="OnButtonClick" />
            </ContentPresenter.Content>
        </ContentPresenter>
    </TabItem>
</TabControl>

如果选择第二个选项卡,则按钮的
CommandParameter=null
。但如果最初为第二个
TabItem
设置了
IsSelected=“True”
,则
CommandParameter
具有正确的值

我需要使用
ContentTemplate
属性来解决此问题。我还可以使用
ContentControl
(但在我的情况下不行,因为
ContentPresenter
是在控件的样式模板中使用的)

  • 由于TabControl和ContentPresenter在我的应用程序中广泛使用,我想知道这种行为的原因——有什么想法吗
  • 还有什么其他方法来处理这个问题

  • 你真的不应该有
    ContentPresenter
    的样式。另外,
    ContentControl
    s default
    ContentTemplate
    包含一个
    ContentPresenter
    ,因此我不明白为什么这会破坏样式。实际上,对于XAML内容,我根本不会使用
    ContentPresenter
    ,只在
    ControlTemplate
    内部使用,对于MVVM viewmodels作为内容使用,
    DataTemplate
    DataType
    匹配。实际上,不应该有
    ContentPresenter
    的样式。另外,
    ContentControl
    s default
    ContentTemplate
    包含一个
    ContentPresenter
    ,因此我不明白为什么这会破坏样式。实际上,对于XAML内容,我根本不会使用
    ContentPresenter
    ,只在
    ControlTemplate
    内部使用,对于MVVM viewmodels,我将使用
    DataTemplate
    和匹配的
    DataType
    来显示内容。