Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证WPF中的两个属性_C#_Wpf_Validation - Fatal编程技术网

C# 验证WPF中的两个属性

C# 验证WPF中的两个属性,c#,wpf,validation,C#,Wpf,Validation,我的类具有以下属性: public DateTime Start { get; set; } public DateTime Finish { get; set; } 以及该模型: <StackPanel> <DatePicker SelectedDate="{Binding Start}" /> <DatePicker SelectedDate="{Binding Finish}" /> &l

我的类具有以下属性:

    public DateTime Start { get; set; }
    public DateTime Finish { get; set; }
以及该模型:

    <StackPanel>
        <DatePicker SelectedDate="{Binding Start}" />
        <DatePicker SelectedDate="{Binding Finish}" />
    </StackPanel>


我想启用验证。所以,当开始>完成时,一定会有错误。提供这种验证的最简单方法是什么

您可以使用
Binding.ValidationRules


您可以找到MSDN示例。

您可以使用
Binding.ValidationRules


您可以找到MSDN示例。

比较get上的值。如果Start>Finish返回null或其他值。

比较get上的值。如果Start>Finish返回null或其他内容。

我自己找到了答案)我扩展了我的TimeRange类来实现IDataErrorInfo接口,如下所示:

public class TimeRange : IDataErrorInfo
{
    public DateTime Start { get; set; }
    public DateTime Finish { get; set; }


    #region IDataErrorInfo Members

    public string Error
    {
        get { throw new NotImplementedException(); }
    }

    private bool _IsValid()
    {
        return Finish > Start;
    }

    public string this[string columnName]
    {
        get
        {
            string result = null;
            if (columnName == "Start" && !_IsValid())
                result = "Start must occure before Finish!";
            else if (columnName == "Finish" && !_IsValid())
                result = "Finish must occure after Start!";
            return result;
        }
    }

    #endregion
}
然后将我的xaml代码更改为:

        <DatePicker SelectedDate="{Binding Start, UpdateSourceTrigger=LostFocus, 
            ValidatesOnDataErrors=true, NotifyOnValidationError=true}" />
        <DatePicker SelectedDate="{Binding Finish, UpdateSourceTrigger=LostFocus,
            ValidatesOnDataErrors=true, NotifyOnValidationError=true}" />

嗯,我自己找到了答案)我扩展了我的TimeRange类来实现IDataErrorInfo接口,如下所示:

public class TimeRange : IDataErrorInfo
{
    public DateTime Start { get; set; }
    public DateTime Finish { get; set; }


    #region IDataErrorInfo Members

    public string Error
    {
        get { throw new NotImplementedException(); }
    }

    private bool _IsValid()
    {
        return Finish > Start;
    }

    public string this[string columnName]
    {
        get
        {
            string result = null;
            if (columnName == "Start" && !_IsValid())
                result = "Start must occure before Finish!";
            else if (columnName == "Finish" && !_IsValid())
                result = "Finish must occure after Start!";
            return result;
        }
    }

    #endregion
}
然后将我的xaml代码更改为:

        <DatePicker SelectedDate="{Binding Start, UpdateSourceTrigger=LostFocus, 
            ValidatesOnDataErrors=true, NotifyOnValidationError=true}" />
        <DatePicker SelectedDate="{Binding Finish, UpdateSourceTrigger=LostFocus,
            ValidatesOnDataErrors=true, NotifyOnValidationError=true}" />


此方法仅验证一个值。我的验证需要比较两个属性。将从DependencyObject继承的属性添加到验证类。将DependencyProperty添加到DependencyObject。使用dependencProperty上的数据绑定,您已经得到了比较两个属性的验证。@Seekeer,这是一个很好的解决方案,尽管没有很好的解释。看看我的博客文章,你可以用它作为一个开始,并将其扩展到一些非常强大的东西。谢谢!这两篇文章非常有用@slugster,但有一个问题:我无法在验证规则类中编写依赖项属性。所以我不能使用其他DatePicker的值作为参数…此方法仅验证一个值。我的验证需要比较两个属性。将从DependencyObject继承的属性添加到验证类。将DependencyProperty添加到DependencyObject。使用dependencProperty上的数据绑定,您已经得到了比较两个属性的验证。@Seekeer,这是一个很好的解决方案,尽管没有很好的解释。看看我的博客文章,你可以用它作为一个开始,并将其扩展到一些非常强大的东西。谢谢!这两篇文章非常有用@slugster,但有一个问题:我无法在验证规则类中编写依赖项属性。所以我不能使用其他日期选择器的值作为参数。。。