如何设置样式而不是路径的转换器?

时间:2012-06-20 14:29:31

标签: wpf binding styles converter attached-properties

我正在尝试为文本框创建一个样式,我想在整个代码中使用它。我的样式在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的自定义控件...我很困惑!

2 个答案:

答案 0 :(得分:1)

在我看来,最好的方法是创建一个继承自TextBox的新类,然后覆盖PropertyMetadata属性的Text,让自己有机会更改Coerce回调中的值。

答案 1 :(得分:1)

您可以创建一个UserControl来完成这项工作:

<UserControl x:Class="namespace.MyCustomConverterTextBox">
    <TextBlock Text="{Binding Text, Converter={StaticResource yourconverter}}"/>
</UserControl>

然后在代码隐藏中声明TextDependencyProperty

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}" />

我没有运行此代码,因此可能存在拼写错误,但它应该足以让您了解如何解决此问题。