我有一个包含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场景很新,所以我希望这是有道理的!
提前致谢。
答案 0 :(得分:1)
Content
和ContentTemplate
之间存在差异。
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}}"/>