附 属性 总有一个样式中的默认值

Attached property always has a default value in a style

我正在使用 WPF,我想使用附加属性来处理控件验证中的一些样式设置(我的问题示例非常简单,绑定一个简单的文本)。

这是我的附件属性:

public class ToolTipExtension
{
    public static readonly DependencyProperty ShowToolTipProperty = DependencyProperty.RegisterAttached(
        "ShowToolTip", typeof(string), typeof(ToolTipExtension), new PropertyMetadata("Deffault"));    

    public static void SetShowToolTip(DependencyObject element, string value)
    {
        element.SetValue(ShowToolTipProperty, value);
    }

    public static string GetShowToolTip(DependencyObject element)
    {
        return (string) element.GetValue(ShowToolTipProperty);
    }    
}

我有一个像这样的简单风格的字典

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:at="clr-namespace:CarpetaTecnicaWPF.AttachedProperties"
                    >   
    <Style TargetType="{x:Type TextBox}" x:Key="Blah" >
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <Grid>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(at:ToolTipExtension.ShowToolTip)}" FontSize="50"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

如您所见,我正在尝试将 Text 属性 绑定到我附加的 属性。

在我的 Page 中,我使用这样的样式:

<TextBox Style="{StaticResource Blah}" at:ToolTipExtension.ShowToolTip="Prueba?"/>

问题是,值 Prueba? 没有出现。当我检查树时,我看到了这个:

但是在运行时,绑定的结果是Deffault

我做错了什么?

您的绑定不正确。

本例中的TemplatedParent并不是您真正需要的。错误的 ControlTemplate 未应用于文本框本身,它是一个独立的控件模板。因此,您只是从错误的 FrameworkElement.

中获取默认值

要访问应用了错误模板的文本框,您需要在 ControlTemplate 中使用 AdornedElementPlaceholder。从 AdornedElementPlaceholder,您可以通过 AdornedElement 属性.

访问您的文本框

这是一个例子:

  <Setter Property="Validation.ErrorTemplate">
    <Setter.Value>
      <ControlTemplate>
        <Grid>
          <AdornedElementPlaceholder x:Name="adorner"/>
          <TextBlock Text="{Binding ElementName=adorner, Path=AdornedElement.(at:ToolTipExtension.ShowToolTip)}"/>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>