XAML データ バインディングでカスタムを使用する方法を見つけたいと思っていましたValidationRule
が、使用されるルールが動的に選択されるように、条件付きで使用したいと考えていました。私の特定の問題では、物理的な位置の範囲を検証したいのですが、ブール値のプロパティ (チェックボックスにバインドされている) に応じて、その範囲は絶対または相対のいずれかになります。
私が実装した検証ルールは次のとおりです (プロパティRange2Sel
は、使用される範囲を決定します)。
class IntDualRangeRule : ValidationRule
{
public int Min1 { get; set; }
public int Max1 { get; set; }
public int Min2 { get; set; }
public int Max2 { get; set; }
public bool Range2Sel { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
ValidationResult vr = ValidationResult.ValidResult;
try
{
int num = int.Parse(value.ToString());
int rangeMin = Range2Sel ? Min2 : Min1;
int rangeMax = Range2Sel ? Max2 : Max1;
if (num < rangeMin || num > rangeMax)
{
vr = new ValidationResult(false, "The value cannot be less than " + rangeMin + " or greater than " + rangeMax + ".");
}
}
catch (FormatException)
{
vr = new ValidationResult(false, "The value \"" + value.ToString() + "\" is not a valid integer number.");
}
return vr;
}
}
次のように、C# コードからこの検証規則を正常に使用できるようになりました。
IntDualRangeRule valInt = new IntDualRangeRule() {
Min1 = GVars.MTP_GANTRY_TPOS_ABS_MIN,
Max1 = GVars.MTP_GANTRY_TPOS_ABS_MAX,
Min2 = GVars.MTP_GANTRY_TPOS_REL_MIN,
Max2 = GVars.MTP_GANTRY_TPOS_REL_MAX,
Range2Sel = Some_Boolean_Property
};
ValidationResult vRes = valInt.Validate(MyTargetPos, System.Globalization.CultureInfo.CurrentCulture);
私が直面した障害は、XAML でこれを実行する方法です (「???」に注意してください)。
<Binding Path="GTargetPos" UpdateSourceTrigger="LostFocus" Mode="TwoWay" >
<Binding.ValidationRules>
<loc:IntDualRangeRule
Min1="{x:Static loc:GVars.MTP_GANTRY_TPOS_ABS_MIN}"
Max1="{x:Static loc:GVars.MTP_GANTRY_TPOS_ABS_MAX}"
Min2="{x:Static loc:GVars.MTP_GANTRY_TPOS_REL_MIN}"
Max2="{x:Static loc:GVars.MTP_GANTRY_TPOS_REL_MAX}"
Range2Sel=???
/>
</Binding.ValidationRules>
</Binding>
バインディングはこの種のパラメーターでは機能しないため、次にどこに行くべきか、または他の人が以前に遭遇したことがある問題の「ベスト プラクティス」は何かわかりません。この特定の問題に加えて、特定の条件下でのみ関連する検証ルールを他の人がどのように扱っているかも知りたいです。
ありがとう!