如何在 DataTemplate 中设置 "inject" 样式

How to "inject" style in a DataTemplate

我试图在我的代码中将数据模板与样式分开。 我使用 DataTemplate 来定义,例如数据应该显示为两个按钮,我使用样式来定义,例如这些按钮的背景应该是绿色的。

我想要实现的是在一个文件中定义一个 DataTemplate 并在多个 UserControls 中使用它,其中样式来自 UserControls。

假设我在 UserControlResources 中有以下样式:

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Foreground" Value="Green"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>

另一个 UserControl 可能有类似的东西,但颜色不同。

然后,我在那个 UserControl 中有一个 ContentControl,它将有一些视图模型和一些 DataTemplate:

<ContentControl Content="{Binding SelectedViewModel}"
                ContentTemplate="{Binding SelectedDataTemplate}"/> 

DataTemplate 可以像这样简单:

<DataTemplate x:Key="TwoButtonsTemplate">
    <StackPanel>
        <Button Content="One"/>
        <Button Content="Two"/>
    </StackPanel>
</DataTemplate>

我希望这两个按钮具有 UserControl.Resources 中的 ButtonStyle 而无需直接引用它。 (因此 DataTemplate 可以来自不同的文件,或者能够在与另一个 UserControl 的样式相似的上下文中使用 DataTemplate)。

我尝试将 ButtonStyleTargetType 更改为 ContentControl,将样式分配给 ContentControl 并在 [=29] 上设置 Foreground="{TemplatedParent Foreground}" =]s,但是通过这种方式,当它们中的任何一个(即 ContentControl 本身)悬停时,两个 Foreground 都会改变。

有没有办法 "inheriting" DataTemplate 中的样式或 "injecting" UserControl 中的样式?

P.S。我知道如果我将样式移动到一个单独的文件中并在 DataTemplate 文件中引用它,我可以简单地将它用作 StaticResource,但这会将 DataTemplate 耦合到该特定样式,我将无法重新 -将它与其他样式一起使用。

尝试动态资源:

<DataTemplate x:Key="TwoButtonsTemplate">
    <StackPanel>
        <Button Content="One" Style="{DynamicResource ButtonStyle}"/>
        <Button Content="Two" Style="{DynamicResource ButtonStyle}"/>
    </StackPanel>
</DataTemplate>

当在声明 ButtonStyle 资源的 UserControl 中实例化 TwoButtonsTemplate 模板时,将找到该资源并将其应用于按钮。