【问题标题】:Custom Validation Rule WPF and Items control自定义验证规则 WPF 和项目控件
【发布时间】:2012-02-07 22:42:17
【问题描述】:

在绑定到数据源的ItemsControl 中,我尝试使用接受参数的自定义验证规则来验证TextBox,以下是验证规则的代码。

public class RatioValidation : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        if (!String.IsNullOrEmpty(Maturity.MaturityValue) && Helper.IsDateInCorrectFormat(Maturity.MaturityValue))
        {
            String strVal = Convert.ToString(value);
            Double ratio = 0;
            Boolean isValid = Double.TryParse(strVal, out ratio);
            if (isValid)
            {
                if (ratio <= 0)
                    return new ValidationResult(false, "Please enter a valid ratio!");
                else return new ValidationResult(true, null);
            }
            return new ValidationResult(false, "Please enter a valid ratio!");
        }
        else return new ValidationResult(true, null);           
    }

    private MaturityDependencyForValidation _maturity;
    public MaturityDependencyForValidation Maturity
    {
        get { return _maturity; }
        set { _maturity = value; }
    }
}

public class MaturityDependencyForValidation : DependencyObject
{
    public String MaturityValue
    {
        get { return (String)GetValue(MaturityValueProperty); }
        set { SetValue(MaturityValueProperty, value); }
    }

    public static readonly DependencyProperty MaturityValueProperty =
        DependencyProperty.Register("MaturityValue", typeof(String), typeof(MaturityDependencyForValidation), new UIPropertyMetadata(null));

}

然后像下面这样使用它,

<TextBox Grid.Row="1" Grid.Column="2"  Name="txtRatio" BorderThickness="0" Width="148" Tag="{Binding StrMaturity, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.Text>
        <Binding Path="Ratio" Mode="TwoWay"  UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <leg:RatioValidation ValidatesOnTargetUpdated="True">
                    <leg:RatioValidation.Maturity>
                         <leg:MaturityDependencyForValidation MaturityValue="{Binding txtMaturity}"/>
                    </leg:RatioValidation.Maturity>
                </leg:RatioValidation>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

我在输出窗口中得到一个异常:

找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定表达式:路径=txt成熟度;数据项=空;目标元素是 'MaturityDependencyForValidation' (HashCode=63478077);目标属性是“成熟度”(类型“字符串”)

RatioValidation 规则内,Maturity 的值永远不会被数据绑定绑定。我需要这个值来进行数据绑定。请帮忙。

【问题讨论】:

    标签: c# wpf xaml data-binding


    【解决方案1】:

    没有DataContext作为周围的对象,至少绑定,不是DependencyObjects,你的选择有些局限,应该和binding in an array时的情况类似,另见@ 987654322@.

    【讨论】:

    • 解决方法是什么?我想验证绑定到集合的 ItemsControl 中的单个(UserControl)项目。用户控件为集合中的每个项目生成一行。它类似于数据网格场景,我们可以在其中指定 rowvalidation 属性并验证单个行项。请问有什么建议吗?
    • @VinayDwivedi:看看链接的问题怎么样?
    • 感谢您解决了我的问题...查看了stackoverflow.com/questions/8886309/…...而且它看起来像您的文章...但提供链接会有所帮助...无论如何非常感谢。
    • @VinayDwivedi:我链接到的两个问题的两个答案都使用相同的技术,其中一个链接从一开始就存在,你只是不想关注它......跨度>
    猜你喜欢
    • 2011-05-20
    • 2017-07-25
    • 1970-01-01
    • 2017-04-11
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    相关资源
    最近更新 更多