如何将xaml中的值绑定到验证规则?

时间:2017-10-02 05:09:49

标签: c# .net wpf xaml

我是.net开发的新手,所以请在这里帮助我。

我试图通过xaml数据绑定将c#类中的值传递给验证规则。

C#class:

VULKAN_HPP_NO_EXCEPTIONS

此处public class NumericDoubleUpDownValueContainerVM : SimpleValueContainerVM<string> { public NumericDoubleUpDownValueContainerVM(double value, double minValue, double maxValue, int decimalPlace) : base(value.ToString()) { this.MinimumValue = minValue; this.MaximumValue = maxValue; this.DecimalPlaces = decimalPlace; } public double MinimumValue { get; set; } public double MaximumValue { get; set; } public int DecimalPlaces { get; set; } public override void UpdatePropertyValue(object value, string propertyName = "") { this.Value = Convert.ToString(value); } } 是一个泛型类,用于从相应的UI元素中获取和设置值。

Xaml代码:

SimpleValueContainerVM<T>

此处ValueWithinLimits规则是我正在使用的那个:

验证规则如下:

<DataTemplate DataType="{x:Type VM:NumericDoubleUpDownValueContainerVM}" >
        <Grid x:Name="Maingrid" >
            <WPFStyles.CustomControls:NumericUpDown Minimum="{Binding MinimumValue}" Maximum="{Binding MaximumValue}" x:Name="Value" Width="{Binding ActualWidth, ElementName=Maingrid}"     
                                                    VerticalAlignment="Center" YIncrementValue="0.1" DecimalPlaces ="{Binding DecimalPlaces}" 
                                                    ToolTip="{Binding ValueToolTip, Converter={x:Static utils:StringToLocalizedStringConverter.Instance}, ConverterParameter=ToolTip}">
                <Binding Path="Value" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" ValidatesOnDataErrors="True">
                    <Binding.ValidationRules>
                        <validationRule:DoubleValidationRule/>
                        <validationRule:ValueWithinLimitsRule ValidatesOnTargetUpdated="True" ValidationStep="RawProposedValue" />
                    </Binding.ValidationRules>
                </Binding>
            </WPFStyles.CustomControls:NumericUpDown>
        </Grid>
    </DataTemplate>

我试过像

这样的东西
    public class ValueWithinLimitsRule : ValidationRule
   {
      public double MaxVal { get; set; }

      public double MinVal { get; set; }

      public override ValidationResult Validate(object value, CultureInfo cultureInfo)
      {
         if (value != null)
         {
            if (Convert.ToDouble(value.ToString()) > this.MaxVal || Convert.ToDouble(value.ToString()) < this.MinVal)
            {
               return new ValidationResult(false, null);
            }
            else
            {
               return new ValidationResult(true, null);
            }
         }

         return new ValidationResult(false, null);
      }
   }

而且效果很好。

现在我想使用<validationRule:ValueWithinLimitsRule ValidatesOnTargetUpdated="True" ValidationStep="RawProposedValue" MinVal="0" MaxVal="100"/>

的属性
NumericDoubleUpDownValueContainerVM

取代0和100。

我已经尝试过google搜索并了解依赖项属性和对象,但无法掌握它。

我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:3)

您可以创建一个派生自DependencyObject的包装类,并公开依赖项属性。然后将CLR属性添加到ValidationRule类,该类返回此包装类型的实例。

public class AgeValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {

        string text = value.ToString();
        int age;
        int.TryParse(text, out age);
        if (age < 10 || age > this.Wrapper.MaxAge)
            return new ValidationResult(false, "Invalid age.");

        return ValidationResult.ValidResult;
    }

    public Wrapper Wrapper { get; set; }
}

public class Wrapper : DependencyObject
{
    public static readonly DependencyProperty MaxAgeProperty =
         DependencyProperty.Register("MaxAge", typeof(int),
         typeof(Wrapper), new FrameworkPropertyMetadata(int.MaxValue));

    public int MaxAge
    {
        get { return (int)GetValue(MaxAgeProperty); }
        set { SetValue(MaxAgeProperty, value); }
    }
}

<强> XAML:

<TextBox xmlns:local="clr-namespace:WpfApplication1">
    <TextBox.Text>
        <Binding Path="Age" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:AgeValidationRule>
                    <local:AgeValidationRule.Wrapper>
                        <local:Wrapper MaxAge="{Binding MaxAge}"/>
                    </local:AgeValidationRule.Wrapper>
                </local:AgeValidationRule>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

有关更多信息和完整示例,请参阅以下文章。

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