2017-03-21 9 views
0

doubleへの結合は、次の検証エラーローカライズExceptionValidationRule

値...変換することができませんでしたを生成することができます。

ExceptionValidationRuleエラーを使用しておしゃべりより、次のとおりです。

入力文字列が正しい形式ではありませんでした。

値は多分もっとある...

には大きすぎるか小さすぎるのいずれかでした。彼らに、私がバウンドプロパティーセッターで自分を投げることができるものを加えてください。

ここで、これらのメッセージをローカライズしたいとします(2番目のバージョンが望ましい)。大きな驚きはありませんが、sourcesは何も役に立たないとは限りません(間違った場所を探していますか?)。

私は自分の検証規則を作ることができますが、もっと簡単な方法がありますか?

私の質問:ExceptionValidationRuleをローカライズすることはできますか?以下は

mcve次のとおりです。


XAML:

<TextBox> 
    <TextBox.Text> 
     <Binding Path="TestDouble" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <!--<local:MyValidationRule />--> 
       <!--<ExceptionValidationRule />--> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
    <Validation.ErrorTemplate> 
     <ControlTemplate> 
      <TextBlock Margin="0,20,0,0" Foreground="Red" Text="{Binding ErrorContent}" /> 
     </ControlTemplate> 
    </Validation.ErrorTemplate> 
</TextBox> 

CS:

public partial class MainWindow : Window 
{ 
    public double TestDouble { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 
} 

public class MyValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) => ValidationResult.ValidResult; // not used 

    public override ValidationResult Validate(object value, CultureInfo cultureInfo, BindingExpressionBase owner) 
    { 
     var bindingExpression = owner as BindingExpression; 
     if (bindingExpression != null) 
     { 
      var type = bindingExpression.ResolvedSource.GetType().GetProperty(bindingExpression.ResolvedSourcePropertyName).PropertyType; 
      if (type == typeof(double)) 
      { 
       double result; 
       if (!double.TryParse((string)value, out result)) 
        return new ValidationResult(false, "The value format is not recognized"); // custom message 
      } 
      ... // and so on, for all types ????? 
     } 
     return base.Validate(value, cultureInfo, owner); 
    } 
} 
+0

例外メッセージはローカライズされていません(http://stackoverflow.com/questions/209133/exception-messages-in-english) – ASh

+0

@ASh、プロフェッショナルな翻訳者とその顧客が行うローカリゼーションについては忘れていました(彼らは 'ダブル 'などについて知ってはいけません)、メッセージテキストをカスタマイズすることについて考えてください。私の問題は、検証エラーを処理する方法です(ユーザーが入力しているときに制御できません).MyValidationRuleは非常に面倒です。 – Sinatr

+0

明らかに、組み込みのExceptionValidationRuleクラスが実装される方法を変更することはできません。独自のカスタム検証ルールを実装する際に何が問題になりますか? Validateメソッドの中に必要な翻訳ロジックを置くことができます。無効な値を入力すると、sourceプロパティのsetterが決してヒットしないため、これを行う正しい方法です。 doubleプロパティはdouble値にしか設定できません。 – mm8

答えて

0

、このようなエラーメッセージをローカライズするには、バインディングのソースを更新中に表示され、への十分なUpdateSourceExceptionFilterバインドのコールバックハンドラ、カスタム検証ルールなし(ExceptionValidationRuleが必要です)。

XAML:

<Binding UpdateSourceExceptionFilter="ExeptionFilter" ...> 

CS:

object ExeptionFilter(object bindingExpression, Exception exception) 
{ 
    return "Localized error message"; 
} 

明らかにそれは(以前C#7、中 - if/else ifswitch/caseすることができ、私の質問に例外固有のメッセージ(もの、を提供するために、 FormatExceptionおよびOverflowException)。