2010-12-16 5 views
2

私は、ExceptionValidationRuleをWPFのフォーム上の多くのテキストボックスに適用する必要性を克服しました。私は、マークアップでこれを行うことができますし、私は望ましい結果を得る(無効な値が入力されたときにテキストボックスが赤いアウトラインを取得します)が、私はマークアップでルールを供給する場合にのみ:WPF/XAML:コードとマークアップで適用するとExceptionValidationRuleが異なりますか?

<TextBox x:Name="Name" Width="150" > 
    <TextBox.Text> 
     <Binding Path="Name" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True"> 
       <Binding.ValidationRules> 
        <ExceptionValidationRule /> 
       </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

しかし、私は使用して値を適用するとコード:

Name.GetBindingExpression(TextBox.TextProperty).ParentBinding.ValidationRules.Add(new ExceptionValidationRule()); 

希望の結果が得られません。このコードは、InitalizeComponent()呼び出しの後でuserControlのコンストラクターに適用されます。ユーザーコントロールには、子コントロールとしてテキストボックス "名前"があります。

2つの検証ルールがValidationRulesコレクションに追加されていますが、コードバージョンのみを使用しているときには、赤いアウトラインの結果が得られません無効な値が入力されたときのテキストボックス

私はWPFの基本的なルールを誤解していますか?

または、スタイルを使用してこの検証ルールを適用する方法はありますか?私はあなたに真実を伝えたいと思う。

おかげで、 M

答えて

2

それが使用された後、あなたがバインドを変更することはできません、とapperentlyそれは同様にValidationRulesのために行きます。コードで新しいBindingを作成することはできますが、それはおそらくあなたの後ろではありません。

Binding binding = new Binding("Name"); 
binding.Mode = BindingMode.TwoWay; 
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
binding.NotifyOnValidationError = true; 
binding.ValidationRules.Add(new ExceptionValidationRule()); 
nameTextBox.SetBinding(TextBox.TextProperty, binding); 

BindingまたはValidationRuleがFrameworkElementから派生しないため、スタイルは機能しません。あなたの状況で私がやることは、必要なものすべてを追加するサブクラス化されたバインディングです。この

<TextBox x:Name="Name" Width="150" >  
    <TextBox.Text>  
     <local:ExBinding Path="Name" 
         Mode="TwoWay" 
         UpdateSourceTrigger="PropertyChanged"/> 
    </TextBox.Text> 
</TextBox> 

ExBindingのようなもの、感謝のValidationRuleなど

public class ExBinding : Binding 
{ 
    public ExBinding() 
     : base() 
    { 
     NotifyOnValidationError = true; 
     ValidationRules.Add(new ExceptionValidationRule()); 
    } 
} 
+0

を追加!それは魅力のように働いた。これでショートカットバインディング( "{Binding SomeProperty}")を使用することはできません! –

+0

ありがとうございました! – Frinavale

関連する問題