在ControlTemplate之外是否有与TemplateBinding等效的东西

本文关键字:TemplateBinding ControlTemplate 是否 | 更新日期: 2023-09-27 18:19:31

我是WPF样式部分的新手。我想做的是在setter中获取附加属性的值,例如:

<Trigger Property="SomeProperty" Value="SomeValue">
    <Setter Property="SomeProperty"
            Value="(My attached property, let's say lcl:MyClass.MyString)"/>
</Trigger>

我知道在ControlTemplate中使用{TemplateBinding lcl:MyClass.MyString}可以得到这样的效果。我的问题是:你能在不使用ControlTemplate的情况下以一种风格来做这件事吗?

在ControlTemplate之外是否有与TemplateBinding等效的东西

您可以尝试使用:

<Setter Property="SomeProperty" Value="{Binding Path=(lcl:MyClass.MyString), RelativeSource={RelativeSource self}}"/>

如果附加的属性作为样式应用于元素。如果没有,则可以使用RelativeSource或ElementName查找相应的元素。

我不确定你是怎么做到的,因为你的代码缺乏细节。以下代码工作:

<UserControl.Resources>
    <Style x:Key="LabelStyle" TargetType="{x:Type Label}">
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Content" 
                Value="{Binding Path=(TestWebBrowser:AttachP.ValueEditorState), RelativeSource={RelativeSource self}}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
<StackPanel>
    <Label x:Name="label" TestWebBrowser:AttachP.ValueEditorState="HelloWorld"  Style="{StaticResource LabelStyle}"/>
    <Button Content="Disable Label" Click="Button_Click"/>
</StackPanel>

Button的单击事件处理程序将Label的IsEnabled设置为false以触发触发器。请注意,您必须在绑定中使用带括号的Path=。