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

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

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

C#类:

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);
          }
    }

这里的SimpleValueContainerVM<T>是一个通用类,用于从相应的UI元素获取和设置值。

XAML代码:

<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>

这里ValueWithinLimits规则是正在使用的规则:

验证规则为:

    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的属性

MinimumValue and MaximumValue

代替0和100。

我尝试使用谷歌搜索并了解依赖属性和对象,但是无法掌握它。

我真的很感谢您的帮助。

参考方案

您可以创建一个包装类,该包装类从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

Div单击与单选按钮相同吗? - php

有没有一种方法可以使div上的click事件与表单环境中的单选按钮相同?我只希望下面的div提交值,单选按钮很丑代码输出如下:<input id="radio-2011-06-08" value="2011-06-08" type="radio" name="radio_date&#…

故障排除“警告:session_start():无法发送会话高速缓存限制器-标头已发送” - php

我收到警告:session_start()[function.session-start]:无法发送会话缓存限制器-标头已发送(错误输出开始如果我将表单数据提交到其他文件进行处理,则可以正常工作。但是,如果我将表单数据提交到同一页面,则会出现此错误。请建议<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0…

将python scikit学习模型导出到pmml - python

我想将python scikit-learn模型导出到PMML。哪个python软件包最合适?我阅读了有关Augustus的内容,但是我无法使用scikit-learn模型找到任何示例。 python大神给出的解决方案 SkLearn2PMML是 JPMML-SkLearn命令行应用程序周围的薄包装。有关受支持的Scikit-Learn Estimator和…

如何使用PHP从动态输入字段捕获数组值? - javascript

我正在编写一个在线时间跟踪网页,允许用户将学习时间输入该系统。用户将首先输入名称,然后根据日期输入学习时间。一天中可能会有多个学习时间。以下是我第一页的编码,<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"…

SOAPFaultException部署在Tomcat上时,但在GlassFish中工作正常 - java

朋友们,我一直在尝试很多,阅读了很多论坛,但无法理解为什么出现此问题。我使用契约优先方法创建了一个Jax-WS WebService。创建WSDL和XSD,然后使用wsimport工具生成其余工件,为SEI提供实现。将WebService应用程序部署到Eclipse Helios中的GlassFish(Glassfish适配器和Eclipse中安装的插件)。…