这个自定义WPF TextBox控件可以替换为附加属性吗?

时间:2011-11-04 22:54:31

标签: wpf data-binding resources controltemplate attached-properties

我有一个扩展WPF TextBox控件的简单控件。基本思想是在UI中保存空间,方法是让TextBox在空的时候在其中显示自己的标签。

我已在其中声明了一个名为DependencyProperty的{​​{1}},并将Label属性设置为TextBox.TemplateControlTemplate是默认的Windows Aero XAML,在控件后面添加了ControlTemplate,显示TextBlock属性的值。只要TextBox.Text属性为空,其Visibility属性就会与Converter绑定。 (有很多,而且大部分都无趣,所以请原谅滚动条。)

Text

(对于绑定,控件的<ControlTemplate x:Key="LabelTextBoxTemplate" TargetType="{x:Type TextBoxBase}" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Aero="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"> <Aero:ListBoxChrome Background="{TemplateBinding Panel.Background}" BorderBrush="{TemplateBinding Border.BorderBrush}" BorderThickness="{TemplateBinding Border.BorderThickness}" RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" RenderFocused="{TemplateBinding UIElement.IsKeyboardFocusWithin}" Name="Border" SnapsToDevicePixels="True"> <Grid> <TextBlock Text="{Binding Label, ElementName=This}" Visibility="{Binding Text, ElementName=This, Converter={StaticResource StringToVisibilityConverter}}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" FontWeight="Normal" FontStyle="Italic" Foreground="#99000000" Padding="3,0,0,0" /> <ScrollViewer Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> </Grid> </Aero:ListBoxChrome> <ControlTemplate.Triggers> <Trigger Property="UIElement.IsEnabled" Value="False"> <Setter TargetName="Border" Property="Panel.Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" /> <Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> 属性设置为Name

所以无论如何,这一切都很好用,但我想知道我是否可以用附加属性替换这个功能。我创建了一个名为This的附加属性,并添加了一个在设置属性时调用的回调委托。在此方法中,我计划从Label中找到ControlTemplate并将Application.Resources属性设置为它...我找不到访问TextBox.Template的方法所以这是我的第一个问题。

如何从附加资产中访问App.xaml中的ControlTemplate中的ControlTemplate

问题的其余部分是如何在“ControlTemplate”中绑定到附加属性?

我尝试了几件事,比如

Application.Resources

但是包含附加属性的Text="{Binding Path=(Attached:TextBoxProperties.Label), Source={x:Static Attached:TextBoxProperties}, FallbackValue=''}" 类不是静态的。

更新&gt;&gt;&gt;

感谢H.B.我发现我可以使用以下代码访问TextBoxProperties

ControlTemplate

1 个答案:

答案 0 :(得分:0)

您应该可以从Application.Resources访问Application.Current.Resources

绑定应该是这样的:

{Binding (Attached:TextBoxProperties.Label),
         RelativeSource={RelativeSource AncestorType=TextBox}}

如果包含该属性的类是静态的,那么bindng引擎将查看该属性是否在TextBox上设置,它不关心声明类。