触发数据触发后设置控件的DataContext

时间:2012-10-19 16:31:07

标签: c# wpf xaml datatrigger contentcontrol

我有一个包含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用户控件旨在显示一个文本块,其Text属性也绑定到同一视图模型中的属性。

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

我试图用以下方式明确说明触发控件的数据上下文:

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

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

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

我对WPF场景很新,所以我希望这是有道理的!

提前致谢。

2 个答案:

答案 0 :(得分:1)

ContentContentTemplate之间存在差异。

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

您正在将Content属性设置为MyFirstControl。您的触发器正在更改ContentTemplate属性,因此它会改变您的内容(MyFirstControl)的绘制方式,因此使用MySecondControl绘制,但Content本身不会更改因此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>

答案 1 :(得分:0)

希望这会有所帮助:

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