如何在wpf/XAML中实现条件验证规则

如何在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作为依赖属性而不是普通属性。