附 属性 总有一个样式中的默认值
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>
我正在使用 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>