如何在wpf/XAML中实现条件验证规则
问题描述:
我希望找到一种在XAML数据绑定中使用自定义ValidationRule
的方法,但要有条件地使用它,以便动态选择使用的规则。对于我的特定问题,我想验证物理位置范围,但该范围可以是绝对或相对的,具体取决于布尔属性(绑定到复选框)。如何在wpf/XAML中实现条件验证规则
这里是验证规则我已经实现(该属性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>
绑定在这类参数上不起作用,所以我不知道下一步该去哪里,或者对于其他人以前遇到的问题,“最佳实践”会是什么。除了这个特定问题之外,我还想知道其他人如何处理仅在特定条件下相关的验证规则。
谢谢!
答
尝试将Min1 Min2 Max1 Max2作为依赖属性而不是普通属性。