1

我有一个包含 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 Error: 40 : BindingExpression path error:)。

我试图明确声明触发控件的数据上下文:

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

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

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

我对 WPF 场景相当陌生,所以我希望这是有道理的!

提前致谢。

4

2 回答 2

1

Content和之间有区别ContentTemplate

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

您将Content属性设置为MyFirstControl. 您的触发器正在更改属性,因此它ContentTemplate正在更改您的 Content() 的绘制方式,MyFirstControl因此使用.MySecondControlContentDataContextMyFirstControl

您可能希望将默认值设置ContentTemplateMyFirstControl而不是实际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>
于 2012-10-19T16:40:39.633 回答
0

希望这会有所帮助:

<local:MySecondControl DataContext="{Binding Path=DataContext, 
                  RelativeSource={RelativeSource TemplatedParent}}"/>
于 2012-10-19T16:41:55.227 回答