WPF:将数据参数传递到样式主题中?

问题描述 投票:0回答:1

我有一个样式可以重复用于多个文本框。在样式中,我定义了一个控件模板——在该控件模板中,我有一些触发器。我希望能够将数据属性从视图传递到这些触发器之一。

这是我在资源词典中定义的当前样式的简化版本:

<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/) 但我不知道'看到它与传递数据属性一起工作。

wpf data-binding binding staticresource dynamicresource
1个回答
0
投票

一般来说,为了重用现有的 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>
© www.soinside.com 2019 - 2024. All rights reserved.