C# 在触发数据后设置控件的DataContext

C# 在触发数据后设置控件的DataContext,c#,wpf,xaml,datatrigger,contentcontrol,C#,Wpf,Xaml,Datatrigger,Contentcontrol,我有一个视图,其中包含一个ContentControl,它的ContentTemplate根据使用数据触发器的视图模型中的布尔属性动态更改 <ContentControl> <!-- MyFirstControl user control by default--> <local:MyFirstControl/> <ContentControl.Style>

我有一个视图,其中包含一个ContentControl,它的ContentTemplate根据使用数据触发器的视图模型中的布尔属性动态更改

        <ContentControl>

            <!-- MyFirstControl user control by default-->
            <local:MyFirstControl/>

            <ContentControl.Style>
                <Style TargetType="ContentControl">                        
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsSelected}"
                                     Value="True">
                            <Setter Property="ContentTemplate">
                                <Setter.Value>
                                    <DataTemplate>
                                        <!-- Different user control when trigger fired-->
                                        <local:MySecondControl />
                                    </DataTemplate>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ContentControl.Style>

        </ContentControl>

触发触发器时显示的MySecondControl用户控件用于显示textblock,其文本属性也绑定到同一视图模型中的属性

我显然错了,但我的想法是触发控件将继承相同的数据上下文。相反,它尝试使用MyFirstControl用户控件作为其数据上下文(我还收到以下错误:System.Windows.data错误:40:BindingExpression路径错误:)

我已尝试使用以下命令显式声明触发控件的数据上下文:

<local:MySecondControl DataContext="{Binding}"/>

但是,它仍然使用默认控件(MyFirstControl)作为其数据上下文

我的问题是,如何强制触发控件使用与其所在的视图文件相同的数据上下文

我是WPF领域的新手,所以我希望这是有意义的


提前感谢。

内容
内容模板
之间有区别

Content
是控件的实际内容,而
ContentTemplate
定义如何绘制
内容

您正在将
Content
属性设置为
MyFirstControl
。您的触发器正在更改
ContentTemplate
属性,因此它正在更改内容(
MyFirstControl
)的绘制方式,以便使用
MySecondControl
绘制内容,但是
内容
本身保持不变,因此
DataContext
仍将是您的
MyFirstControl

您可能希望将默认的
ContentTemplate
设置为
MyFirstControl
,而不是实际的
Content
属性

<ContentControl>

    <ContentControl.Style>
        <Style TargetType="ContentControl">  
            <!-- Set default ContentTemplate -->
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <local:MyFirstControl />
                    </DataTemplate>
                </Setter.Value>
            </Setter>

            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected}"
                             Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <!-- Different user control when trigger fired-->
                                <local:MySecondControl />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>

</ContentControl>


内容
内容模板
之间有区别

Content
是控件的实际内容,而
ContentTemplate
定义如何绘制
内容

您正在将
Content
属性设置为
MyFirstControl
。您的触发器正在更改
ContentTemplate
属性,因此它正在更改内容(
MyFirstControl
)的绘制方式,以便使用
MySecondControl
绘制内容,但是
内容
本身保持不变,因此
DataContext
仍将是您的
MyFirstControl

您可能希望将默认的
ContentTemplate
设置为
MyFirstControl
,而不是实际的
Content
属性

<ContentControl>

    <ContentControl.Style>
        <Style TargetType="ContentControl">  
            <!-- Set default ContentTemplate -->
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <local:MyFirstControl />
                    </DataTemplate>
                </Setter.Value>
            </Setter>

            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected}"
                             Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <!-- Different user control when trigger fired-->
                                <local:MySecondControl />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>

</ContentControl>

希望这将有助于:

<local:MySecondControl DataContext="{Binding Path=DataContext, 
                  RelativeSource={RelativeSource TemplatedParent}}"/>

希望这将有助于:

<local:MySecondControl DataContext="{Binding Path=DataContext, 
                  RelativeSource={RelativeSource TemplatedParent}}"/>