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

上記のコードを書くと、「双方向バインディングにはパスまたは 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

上記のコードを使用しようとすると、正常にコンパイルされますが、CustomAttachedProperty のさまざまなインスタンスを作成している可能性があるため、XAML では何もしていないようです。

長い質問で申し訳ありませんが、WPF を使用して独自の既定のコンバーターを持つカスタム コントロールを簡単に作成できるはずだと思いました...混乱しています!

4

2 に答える 2

1

私の意見では、これを行う最良の方法は、から継承する新しいクラスを作成し、プロパティのをTextBoxオーバーライドして、コールバックの値を変更できるようにすることです。PropertyMetadataTextCoerce

于 2012-06-20T15:22:00.057 に答える