1

验证两个属性依赖于另一个属性的推荐方法是什么?

经典示例是开始日期应低于结束日期:

  1. 用户输入开始“6th”
  2. 用户输入end "3rd" - 两个字段都应标记为无效
  3. 用户将开始更正为“1st” - 两个字段都应该没问题

ReactiveValidatedObject 如何在这里提供帮助?

我最好需要一个适用于 WPF 和 Silverlight 的解决方案。

4

1 回答 1

2

如果您在 WPF 应用程序中使用 MVVM 模式,那将非常简单。ViewModel 会进行验证,而不是 View 进行验证。View 应该只是一个愚蠢的层,显示 ViewModel 公开的任何内容。所有 UI 验证都应由 ViewModel 完成,以便它们可测试。

我的 ViewModel 可能如下所示:

class MyViewModel : INotifyPropertyChanged
{
    /* declare ProperChanged event and implement  OnPropertyChanged() method */

    private DateTime _firstDate;
    public DateTime FirstDate
    {
        get { return _firstDate; }
        set
        {
            if (!AreDatesValid(value, _secondDate))
            {
                ErrorMessage = "Incorrect First Date";
                return;
            }
            _firstDate = value;
            OnPropertyChanged("FirstDate");
        }
    }

    private DateTime _secondDate;
    public DateTime SecondDate
    {
        get { return _secondDate; }
        set
        {
            if (!AreDatesValid(_firstDate, value))
            {
                ErrorMessage = "Incorrect Second Date";
                return;
            }
            _secondDate = value;
            OnPropertyChanged("SecondDate");
        }
    }

    private string _errorMessage;
    public string ErrorMessage
    {
        get { return _errorMessage; }
        set
        {
            _errorMessage = value;
            OnPropertyChanged("ErrorMessage");
        }
    }

    private bool AreDatesValid(DateTime firstDate, DateTime secondDate)
    {
        if(firstDate <= secondDate )
            return true;
        return false;
    }
}

然后将 View 数据绑定到这个 ViewModel ->

        <DataTemplate DataType="{x:Type ViewModel:MyViewModel}">
           <Grid>
               <TextBox Text="{Binding Path=FirstDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
               <TextBox Text="{Binding Path=SecondDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
               <TextBlock Text="{Binding Path=ErrorMessage}" />
           </Grid>
        <DataTemplate>
于 2011-05-26T15:48:22.333 回答