我有一个样式可以重复用于多个文本框。在样式中,我定义了一个控件模板——在该控件模板中,我有一些触发器。我希望能够将数据属性从视图传递到这些触发器之一。
这是我在资源词典中定义的当前样式的简化版本:
<Style x:Key="TextBoxTheme" TargetType="{x:Type TextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border x:Name="border">
<ScrollViewer x:Name="PART_ContentHost" Focusable="false/>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding PARAMETER}" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="Red"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
有一个 DataTrigger“(Binding PARAMETER}”,它将确定边框是否设置为红色。根据我使用此文本框的位置,我想将其绑定到不同的变量。
我希望能够将其作为参数从我的视图中传递。我正在想象这样的事情(只是我认为它应该如何工作的想法,但这不起作用):
<TextBox Style="{StaticResource TextBoxTheme, Parameter={Binding PARAMETER}}"/>
<TextBox Style="{StaticResource TextBoxTheme, Parameter={Binding DIFFERENT_PARAMETER}}"/>
由于我还不知道该怎么做,每次调用它时我几乎都在重写相同的代码。
示例(将此样式与我的“名称”文本框一起使用):
<TextBox Text="{Binding Name}">
<TextBox.Style>
<Style TargetType="TextBox" BasedOn="{StaticResource TextBoxTheme}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border x:Name="border">
<ScrollViewer x:Name="PART_ContentHost" Focusable="false"/>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding DuplicateName}" Value="False">
<Setter Property="BorderBrush" TargetName="border" Value="Green"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TextBox.Style>
示例(当我想使用具有不同绑定的相同样式时):
<TextBox Text="{Binding IpAddress}">
<TextBox.Style>
<Style TargetType="TextBox" BasedOn="{StaticResource TextBoxTheme}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border x:Name="border">
<ScrollViewer x:Name="PART_ContentHost" Focusable="false"/>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding DuplicateIP}" Value="False">
<Setter Property="BorderBrush" TargetName="border" Value="Green"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TextBox.Style>
有更好的方法吗?我找到了一篇文章,向您展示了如何将属性传递给样式 (https://thomaslevesque.com/2011/10/01/wpf-creating-parameterized-styles-with-attached-properties/) 但我不知道'看到它与传递数据属性一起工作。
一般来说,为了重用现有的 Style,Style.Triggers 比 ControlTemplate.Triggers 更好,因为 Style.Triggers 可以在派生的 Style 中定义。
一个简单的基本样式就像:
<Style x:Key="TextBoxTheme" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="BorderThickness" Value="2"/>
</Style>
然后可以定义两个不同Style.Triggers的派生Style
<Style x:Key="TextBoxTheme1" TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextBoxTheme}">
<Style.Triggers>
<DataTrigger Binding="{Binding PARAMETER}" Value="True">
<Setter Property="BorderBrush" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="TextBoxTheme2" TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextBoxTheme}">
<Style.Triggers>
<DataTrigger Binding="{Binding DuplicateName}" Value="False">
<Setter Property="BorderBrush" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
或者,如果您想为每个 TextBox 指定 Style.Triggers,那么在每个 TextBox 中定义一个 Style 会更容易。
<TextBox Text="example">
<TextBox.Style>
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource TextBoxTheme}">
<Style.Triggers>
<DataTrigger Binding="{Binding DuplicateIP}" Value="False">
<Setter Property="BorderBrush" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>