2

我正在实现一个函数“WPF Validation On StartDate and EndDate (StartDate less than Enddate)”,如果 EndDate 小于 StartDate,我在后面的代码中编写代码以引发异常,现在它可以工作了。但是我遇到了关于 StartDate 和 EndDate 文件验证的问题。由于这两个属性是我数据库中的必填字段,除非您填写这两个字段,否则应禁用“保存”按钮。但现在 StartDate 和 EndDate 文件不是强制性的。我附上我的代码。你能花几分钟看看我的代码并提供一些建议吗?非常感谢。

代码背后

public partial class OrganisationTypeSView : UserControl
{

    OrganisationTypeViewModel _dataContext = new OrganisationTypeViewModel();
    public OrganisationTypeSView()
    {
        InitializeComponent();

     this.DataContext = _dataContext;

        _dataContext.AccountStartDate = DateTime.Now;
        _dataContext.AccountEndDate = DateTime.Now.AddMonths(1);
        this.Loaded += new RoutedEventHandler(OrganisationTypeSView_Loaded);
    }

    void OrganisationTypeSView_Loaded(object sender, RoutedEventArgs e)
    {

    }

}

圣诞节

<WPFToolkit:DatePicker Grid.Column="1" Grid.Row="4" Name="dpAccStart" VerticalAlignment="Top" 
        SelectedDate="{Binding AccountStartDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" />

<WPFToolkit:DatePicker Grid.Column="1" Grid.Row="5" Name="dpAccEnd" VerticalAlignment="Top" 
        SelectedDate="{Binding AccountEndDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>

视图模型

    private DateTime? _AccountStartDate;
    private DateTime? _AccountEndDate;        
    public event PropertyChangedEventHandler PropertyChanged; 

    [Required(ErrorMessage = "Account Start Date is a required field.")]
    public DateTime? AccountStartDate
    {
        get { return _AccountStartDate; }
        set
        {

            if (_AccountStartDate != DateTime.MinValue && AccountEndDate != DateTime.MinValue)
            {

                if (value > _AccountEndDate)
                {                        
                    MessageBox.Show("Start date must be less than End date");
                    value = this.AccountStartDate;                    
                }
             }
            _AccountStartDate = value;

           if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("AccountStartDate"));
            }
        }
    }

    [Required(ErrorMessage = "Account End Date is a required field.")]
    public DateTime? AccountEndDate
    {
        get { return _AccountEndDate; }
        set
        {
            if (_AccountStartDate != DateTime.MinValue && AccountEndDate != DateTime.MinValue)
            {
                if (_AccountStartDate > value)
                {
                    MessageBox.Show("End date must be after Start date");
                    value = this.AccountEndDate;
                }
            }

            _AccountEndDate = value;

            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("AccountEndDate"));
            }
      }
    }
4

3 回答 3

0

我通过删除代码“_dataContext.AccountStartDate = DateTime.Now; _dataContext.AccountEndDate = DateTime.Now.AddMonths(1);”解决了这个问题 在后面的代码中。由于我为 StartDate 和 EndDate 字段提供了初始日期,因此它会自动获取初始日期,因此将激活保存按钮。

于 2013-08-20T09:29:04.863 回答
0

您想要的是基于绑定类完整性的验证规则。让你的 ViewModel 实现 INotifyDataErrorInfo 接口并实现 GetErrors、HasErrors 等。

最后添加

ValidatesOnNotifyDataErrors=True 

到绑定。

这允许您检查整个模型的一致性,而不仅仅是单个属性。

于 2013-07-19T10:36:04.593 回答
0

我想除了验证之外,您还应该将 Save 命令与 CanExecute 处理程序一起使用,该处理程序将检查 dpAccStart 和 AccountEndDate 的值,如下所示:

    private DateTime? _AccountStartDate;
    private DateTime? _AccountEndDate; 

    //Your code

    RelayCommand _saveCommand;
    public ICommand SaveCmd
    {
        get
        {
            if (_saveCommand == null)
                _saveCommand = new RelayCommand(ExecuteSaveCommand, CanExecuteCommand);
            return _saveCommand;
        }
    }

    private void ExecuteSaveCommand(object parameter)
    {
        //your saving logic
    }

    private bool CanExecuteCommand(object parameter)
    {
        if (string.IsNullOrEmpty(_AccountStartDate) ||
            string.IsNullOrEmpty(_AccountEndDate))
            return false;
        return true;
    }

然后在 XAML 中,您可以分配 SaveCmd 命令保存按钮:

   <Button Command="{Binding SaveCmd}">

在此之后,WPF 将根据您的 CanExecute 处理程序的条件自动检查使其启用或禁用的日期值

于 2013-07-19T11:18:17.883 回答