3

我正在尝试为我希望能够在我的代码中使用的文本框创建一种样式。我的样式在 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 默认转换器......我很困惑!

4

2 回答 2

1

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

于 2012-06-20T15:22:00.057 回答
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 (string) GetValue(TextProperty);} 
        set{SetValue(TextProperty, value);}
    }

    public static readonly DependencyProperty TextProperty = 
        DependencyProperty.Register("Text", typeof(string), typeof(MyCustomConverterBox));
 }

这应该足以让您在 xaml 中使用它:

<local:MyCustomConverterTextBox Text="{Binding YourBinding}" />

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

于 2017-08-21T16:00:06.287 回答