5

テキストボックスから継承するコントロールがあります

public class MyTextBox : TextBox

これにはスタイルがあります

<Style TargetType="{x:Type Controls:MyTextBox}">

セッターの1人は

<Setter Property="Template">

テンプレート内の何かに設定できるようにしたいBinding.ValidationRulesので、このタイプのテキストボックスのすべてのインスタンスに影響します。したがって、時間、日付、数値、郵便番号などのテキストボックスを作成できます。

テキストボックスを作成するたびに検証ルールを設定する必要はありません。私NumericTextBoxは、テンプレートに設定されている方法で検証したいと言いたいだけです。

これは可能ですか?

これまでに見たのは、コントロールの各インスタンスに設定されている ValidationRules だけです。

<TextBox x:Name="txtEMail" Template={StaticResource TextBoxErrorTemplate}>
<TextBox.Text>
    <Binding Path="EMail" UpdateSourceTrigger="PropertyChanged" >
        <Binding.ValidationRules>
            <local:RegexValidationRule Pattern="{StaticResource emailRegex}"/>
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>

( http://www.wpftutorial.net/DataValidation.htmlから)

4

2 に答える 2

4

ご覧のとおり、バインディングと共に検証ルールが設定されています。私は同じ問題に遭遇し、私にとって有効な解決策は次のようなことでした:

    public MyTextBox()
    {            
        this.Loaded += new RoutedEventHandler(MyTextBox_Loaded);
    }

    void MyTextBox_Loaded(object sender, RoutedEventArgs e)
    {
        var binding = BindingOperations.GetBinding(this, TextBox.ValueProperty);
        binding.ValidationRules.Add(new MyValidationRule());
    }

ここでの問題は、検証ルールを追加する前にバインドが設定されていることを確認することです。したがって、Loaded を使用しますが、これがすべてのシナリオで機能するかどうかはわかりません。

于 2011-09-05T16:10:30.987 に答える
1

あなたが望むことを正確に行うことができるかどうかはわかりません。プロパティセッターで多くの策略を使ってそれを行うことができるかもしれません(定義上動的であるバインディングの変更が必要になるため、私はこれに依存しません)、またはコードビハインド/カスタムコントロールを使用します。

代わりに、検証を ViewModel にプッシュすることをお勧めしますIDataErrorInfo。そこには多くの記事があります。「MVVM検証」を検索して最初に見つけたものの1つを次に示します。

MVVM-検証

これを行うと、標準的な OO 構成手法を使用できるようになるため、繰り返しを避けることができます:)

于 2011-09-06T03:53:07.643 に答える