验证WPF和SL中的依赖属性

时间:2011-05-05 10:13:16

标签: wpf silverlight validation reactiveui

根据另一个属性验证两个属性的推荐方法是什么?

经典示例 start 应低于 end 日期:

  1. 用户输入 start “6th”
  2. 用户输入 end “3rd” - 两个字段都应标记为无效
  3. 用户将开始更正为“1st” - 两个字段都应该正常
  4. ReactiveValidatedObject如何在这里提供帮助?

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

1 个答案:

答案 0 :(得分: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;
    }
}

然后数据绑定查看此ViewModel - &gt;

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