C# 在触发数据后设置控件的DataContext
我有一个视图,其中包含一个ContentControl,它的ContentTemplate根据使用数据触发器的视图模型中的布尔属性动态更改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>
<!-- 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}}"/>