4

カスタム コントロールがあり、その中にテキスト ボックスがあります。渡されたパラメーターを含むいくつかのカスタム検証ルールを適用したい (たとえば、範囲チェックを実装するため)。

このように最上位のカスタム コントロールに検証ルールを適用したいと思います。余分なコードを削除して例をより一般的なものにするために最善を尽くしましたが、完全に成功していない場合はご容赦ください。私は、フォーラムにコードを投稿するという考えに少し慣れていません。

<ns_control:CustomControl PropertyName="Value from embedded textBox:"  
    Style="{StaticResource errorInTextBox}">
        <ns_control:CustomControl.PropertyValue>
            <Binding Path="PathX"
                     Mode="TwoWay">
                                    <Binding.ValidationRules>
                                        <validation:IntegerInputRule Max="100" />
                                    </Binding.ValidationRules>
            </Binding>
        </ns_control:CustomControl.PropertyValue>
</ns_control:CustomControl>

コントロールの呼び出しは以上です。私の実際のコードには、 Validation.ErrorTemplate も何かを行うように設定されているものがいくつかありますが、それはこの例には不要なようです。スタイル、errorInTextBox は、検証ルールが失敗したときにカスタム コントロール内の texbox がどのように動作するかを設定するため、問題の中心にあります。これまでのところ、これを行う方法を理解できた最善の方法は、Style.Resources を使用して、カスタム コントロール内にある任意のテキスト ボックスに必要なスタイルを適用することです。

        <Style x:Key="errorInTextBox"
           TargetType="Control">
        <Style.Resources>
            <Style TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="Validation.HasError"
                             Value="true">
                        <Setter Property="ToolTip"
                                Value="{Binding RelativeSource={RelativeSource Self},
                                Path=(Validation.Errors)[0].ErrorContent}" />
                        <Setter Property="BorderBrush"
                                Value="Green" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Style.Resources>
    </Style>

エラーが見つかった場合、上記はツールチップとテキストボックスの境界線の変更を行います。少なくともそれは私がやりたいことです。私の主な問題は Style.Trigger にあります。これが私の失敗点です。Validation.HasError が true のときにトリガーが必要です。問題は、検証ルールがカスタム コントロールに対して設定されており、その中のテキスト ボックスに対して設定されていないため、テキスト ボックスが HasError 値が実際に何であるかを認識していないように見えることです。Validation.ErrorTemplate を使用して borderbrush プロパティなどを変更しようとしましたが、上記で使用した Style.Resource のようにテンプレートがテキスト ボックスのプロパティにアクセスできないようで、テキスト ボックスの周囲の境界線を変更できません。等

これを回避する方法はありますか、またはカプセル化のアイデアをあきらめて、この方法でカスタムコントロールを使用していて検証が必要な場合は、テキストボックスを最初から定義する必要がありますか? そこにそれらを定義すると、テキストボックスのプロパティにアクセスできるようになりますが、多くの冗長な XAML が発生し、思いどおりに動作させることができる場合よりもはるかに洗練されていないように見えます。

目玉とアドバイスをくれたすべての人に感謝します。

よろしく、ヴィック

4

1 に答える 1

0

質問から、テキストボックスではなくコントロールに設定されている検証ルールを許容できるかどうかわかりません。

コントロールにルールを設定できる場合は、そのControlTemplateで、テキスト ボックスに名前を付けます ( と仮定しますx:Name="TextHolder")。加えControlTemplate.Triggersて:

<Trigger Property="Validation.HasError"
         Value="True">
    <Setter TargetName="TextHolder"
            Property="ToolTip"
            Value="{Binding RelativeSource={RelativeSource Self},
            Path=(Validation.Errors)[0].ErrorContent}" />
    <Setter TargetName="TextHolder"
            Property="BorderBrush"
            Value="Green" />
</Trigger>

これにより、コントロールの検証がチェックされ、失敗した場合、セッターはテキスト ボックスのプロパティにアクセスします。


テキストボックスにルールを設定する必要がある場合 -

  • ValidationRuleタイプの依存関係プロパティをコントロールに追加します。
  • テンプレートからテキスト ボックスを取得します (オーバーライドTemplate.FindName内から)。OnApplyTemplate
  • テキスト ボックスのプロパティのバインドを取得しTextます (少しトリッキーです。今は構文を覚えていないでください)。
  • 上記のプロパティからバインディングに検証規則を追加します。
于 2012-05-30T16:31:30.057 に答える