我正在尝试为文本框创建一个样式,我想在整个代码中使用它。我的样式在Text属性的绑定中定义了一个转换器,但是没有设置它的路径,因为无论我在哪里使用这种样式,我的绑定数据都可能没有相同的名称。
<Style x:Key="CustomTextBox" BasedOn="{StaticResource {x:Type TextBox}}"
TargetType="{x:Type TextBox}">
<Setter Property="Text">
<Setter.Value>
<Binding>
<Binding.Converter>
<CustomTextBoxConverter/>
</Binding.Converter>
</Binding>
</Setter.Value>
</Setter>
</Style>
然后使用customTextBox:
<TextBox Height="28" Name="txtRate" Style="{StaticResource CustomTextBox}"
MaxLength="5" Text="{Binding Path=BoundData}"/>
当我编写上面的代码时,我得到一个“双向绑定需要Path或XPath”的执行。
我甚至尝试创建一个在样式绑定中使用的附加属性,以反映样式中的这个值,但我也无法工作。见下:
<Converters:SomeConvertingFunction x:Key="CustomTextConverter"/>
<local:CustomAttachedProperties.ReflectedPath x:Key="ReflectedPath"/>
<Style x:Key="CustomTextBox" BasedOn="{StaticResource {x:Type TextBox}}"
TargetType="{x:Type TextBox}">
<Setter Property="Text">
<Setter.Value>
<Binding Path=ReflectedPath Converter=CustomTextConverter/>
</Setter.Value>
</Setter>
</Style>
在如下页面中使用:
<TextBox Height="28" Name="txtRate" Style="{StaticResource CustomTextBox}"
MaxLength="5" CustomAttachedProperty="contextBoundDataAsString"/>
附加属性的代码是:
Public Class CustomAttachedProperties
Public Shared ReadOnly ReflectedPathProperty As DependencyProperty =
DependencyProperty.RegisterAttached("ReflectedPath", GetType(String),
GetType(CustomAttachedProperties))
Public Shared Sub SetReflectedPath(element As UIElement, value As String)
element.SetValue(ReflectedPathProperty, value)
End Sub
Public Shared Function GetReflectedPath(element As UIElement) As String
Return TryCast(element.GetValue(ReflectedPathProperty), String)
End Function
End Class
当我尝试使用上面的代码时,它编译得很好,但它似乎没有在我的XAML上做任何事情,就像它可能会创建CustomAttachedProperty的不同实例。
很抱歉这个长长的问题,但我认为应该很容易创建自带默认转换器和WPF的自定义控件...我很困惑!
答案 0 :(得分:1)
在我看来,最好的方法是创建一个继承自TextBox
的新类,然后覆盖PropertyMetadata
属性的Text
,让自己有机会更改Coerce
回调中的值。
答案 1 :(得分:1)
您可以创建一个UserControl
来完成这项工作:
<UserControl x:Class="namespace.MyCustomConverterTextBox">
<TextBlock Text="{Binding Text, Converter={StaticResource yourconverter}}"/>
</UserControl>
然后在代码隐藏中声明Text
为DependencyProperty
:
public partial class MyCustomConverterTextBox : UserControl
{
public string Text {
get{return GetValue(TextProperty);}
set{SetValue(TextProperty, value);}
}
public static readonly DependencyProperty TextProperty =
DependencyPropery.Register("Text", typeof(string), typeof(MyCustomConverterBox));
}
这应该足以让你在你的xaml中使用它:
<local:MyCustomConverterTextBox Text="{Binding YourBinding}" />
我没有运行此代码,因此可能存在拼写错误,但它应该足以让您了解如何解决此问题。