如何在 DataTemplate 中设置 "inject" 样式
How to "inject" style in a DataTemplate
我试图在我的代码中将数据模板与样式分开。
我使用 DataTemplate 来定义,例如数据应该显示为两个按钮,我使用样式来定义,例如这些按钮的背景应该是绿色的。
我想要实现的是在一个文件中定义一个 DataTemplate 并在多个 UserControl
s 中使用它,其中样式来自 UserControl
s。
假设我在 UserControl
的 Resources
中有以下样式:
<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)。
我尝试将 ButtonStyle
的 TargetType
更改为 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 模板时,将找到该资源并将其应用于按钮。
我试图在我的代码中将数据模板与样式分开。 我使用 DataTemplate 来定义,例如数据应该显示为两个按钮,我使用样式来定义,例如这些按钮的背景应该是绿色的。
我想要实现的是在一个文件中定义一个 DataTemplate 并在多个 UserControl
s 中使用它,其中样式来自 UserControl
s。
假设我在 UserControl
的 Resources
中有以下样式:
<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)。
我尝试将 ButtonStyle
的 TargetType
更改为 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 模板时,将找到该资源并将其应用于按钮。