繁体   English   中英

根据 WPF 中的 TextBox 值设置 RangeValidator 最小值

[英]Set a RangeValidator Minimum dependent on TextBox Value in WPF

我有一些由范围验证器“控制”的文本框:

public class RangeValidator : ValidationRule
{

  public int Min { get; set; }
  public int Max { get; set; }
  public bool CheckZeroValue { get; set; }

  public RangeValidator() { }

  public override ValidationResult Validate(object value, CultureInfo cultureInfo)
  {
    int Value = 0;

    try
    {
      if (((string)value).Length > 0)
        Value = Int32.Parse((String)value);
    }
    catch (Exception e)
    {
      return new ValidationResult(false, "Wrong Character - " + e.Message);
    }

    if (CheckZeroValue && (Value == 0))
      return new ValidationResult(true, null);

    if ((Value < Min) || (Value > Max))
    {
      return new ValidationResult(false, String.Format("The range is: {0} - {1}", Min, Max));            
    }
    else
    {
      return new ValidationResult(true, null);
    }
  }
}

现在,我想要做的是,当用户更改文本框值时,另一个文本框的 Min 会相应地更改,就像这样..

  <TextBox Grid.Row="1" Grid.Column="1" MaxLength="2" Name="FLD_OPEN_SNS_MIN">
    <TextBox.Text>
      <Binding Path='Fields[(local:EFields)FLD_OPEN_SNS_MIN]'
                UpdateSourceTrigger="PropertyChanged"
                NotifyOnValidationError="True"
                ValidatesOnExceptions="True" >
        <Binding.ValidationRules>
          <local:RangeValidator Min="10" Max="50"/>
        </Binding.ValidationRules>
      </Binding>
    </TextBox.Text>
  </TextBox>

  <TextBox Grid.Row="2" Grid.Column="1" MaxLength="3" Margin="5" >
    <TextBox.Text>
      <Binding Path='Fields[(local:EFields)FLD_OPEN_SNS_MAX]'
                UpdateSourceTrigger="PropertyChanged"
                NotifyOnValidationError="True"
                ValidatesOnExceptions="True" >
        <Binding.ValidationRules>
          <local:RangeValidator Min="{Binding ElementName=FLD_OPEN_SNS_MIN, 
                                              Path=Text
                                              Converter={StaticResource StringToIntConverter}}" Max="50"/>
        </Binding.ValidationRules>
      </Binding>
    </TextBox.Text>
  </TextBox>

这不起作用,因为 ValidationRule 类不是 DependencyObject。 有没有办法在不使用背后代码的情况下实现这一点?

这不起作用,因为 ValidationRule 类不是 DependencyObject。 有没有办法在不使用背后代码的情况下实现这一点?

您可以创建一个从 DependencyObject 派生的包装类并公开依赖项属性。 有关详细信息,请参阅以下 TechNet 文章。

WPF:将数据绑定值传递给验证规则: https : //social.technet.microsoft.com/wiki/contents/articles/31422.wpf-passing-a-data-bound-value-to-a-validation-规则.aspx

<TextBox Grid.Row="2" Grid.Column="1" MaxLength="3" Margin="5">
    <TextBox.Resources>
        <local:BindingProxy x:Key="proxy" Data="{Binding ElementName=FLD_OPEN_SNS_MIN}"/>
    </TextBox.Resources>
    <TextBox.Text>
        <Binding Path='Fields[(local:EFields)FLD_OPEN_SNS_MAX]'
                UpdateSourceTrigger="PropertyChanged"
                NotifyOnValidationError="True"
                ValidatesOnExceptions="True" >
            <Binding.ValidationRules>
                <local:RangeValidator Max="50"/>
                <local:RangeValidator.Wrapper>
                    <local:Wrapper Min="{Binding Path=Text, Source={StaticResource proxy}, Converter={StaticResource StringToIntConverter}}"/>
                </local:RangeValidator.Wrapper>
            </Binding.ValidationRules>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM