Silverlight 4中的datepickers问题

时间:2011-02-26 13:54:40

标签: c# silverlight

我有两个日期选择器 - 一个用于“从”,另一个用于“到”。如果From日期变为大于To日期,我需要将To日期更改为From日期 - 反之亦然。目前,如果我在选择From日期后关注To日期的文本框,那么set属性将触发两次,从而重置正确的日期。但是,如果我从日历控件中选择一个日期而不是键入它,它可以正常工作。

这是我的xaml:

    <Grid Grid.Row="1" VerticalAlignment="Top" BindingValidationError="dateVisitStartFrom_BindingValidationError">
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="1" Orientation="Horizontal">
            <TextBlock Text="From: "></TextBlock>
            <basics:DatePicker VerticalAlignment="Top" Height="20" x:Name="dateVisitStartFrom" SelectedDate="{Binding VisitStartDateFrom,Mode=TwoWay,NotifyOnValidationError=True,ValidatesOnExceptions=True}" Style="{StaticResource DatePickerStyle1}" >
                <!--<interactivity:Interaction.Triggers>
                    <interactivity:EventTrigger EventName="BindingValidationError">
                        <MVVMLight:EventToCommand Command="{Binding RectifyDateValidationErrorCommand}"></MVVMLight:EventToCommand>
                    </interactivity:EventTrigger>
                </interactivity:Interaction.Triggers>-->
            </basics:DatePicker>

            <TextBlock Text="To: " Margin="10,0,0,0"></TextBlock>
            <basics:DatePicker x:Name="dateVisitStartTo" VerticalAlignment="Top" Height="20" SelectedDate="{Binding VisitStartDateTo,Mode=TwoWay,NotifyOnValidationError=True,ValidatesOnExceptions=True}" Style="{StaticResource DatePickerStyle1}"></basics:DatePicker>
        </StackPanel>
    </Grid>

这是VM:

private DateTime visitStartDateFrom = System.DateTime.Now.Subtract(new TimeSpan(7,0,0,0));
    public DateTime VisitStartDateFrom
    {
        get
        {
            return visitStartDateFrom;
        }
        set
        {

            visitStartDateFrom = value;

            if (visitStartDateFrom > visitStartDateTo)
            {
                throw new Exception();
                //visitStartDateTo = visitStartDateFrom;
                //OnPropertyChanged("VisitStartDateTo");
            }

            //OnPropertyChanged("VisitStartDateFrom");

        }
    }




    private DateTime visitStartDateTo = System.DateTime.Now;
    public DateTime VisitStartDateTo
    {
        get
        {
            return visitStartDateTo;
        }
        set
        {

            {

                visitStartDateTo = value;
                if (visitStartDateFrom > visitStartDateTo)
                {
                    //visitStartDateFrom = visitStartDateTo;
                    //OnPropertyChanged("VisitStartDateFrom");
                    throw new Exception();
                }
                //OnPropertyChanged("VisitStartDateTo");

            }
        }
    }

AND HEre是后面代码中的bindingvalidationerror函数。

 private void dateVisitStartFrom_BindingValidationError(object sender, ValidationErrorEventArgs e)
    {
        if (e.Action == ValidationErrorEventAction.Added)
        {

            if (((DatePicker)e.OriginalSource).Name == "dateVisitStartFrom")
            {
                dateVisitStartFrom.Focus();
                this.UpdateLayout();
                dateVisitStartTo.SelectedDate = ((DatePicker)e.OriginalSource).SelectedDate;
            }
            else
            {
                dateVisitStartFrom.SelectedDate = ((DatePicker)e.OriginalSource).SelectedDate;
            }

        }
    }

可以看出,我已经尝试了很多方法,但似乎没有什么可以纠正这个错误。任何解决方案都可以节省我的一天......

1 个答案:

答案 0 :(得分:0)

这是我尝试的内容,我认为它可以完成您的目标。

XAML:

<sdk:DatePicker SelectedDate="{Binding FromDate,Mode=TwoWay}" />
<sdk:DatePicker SelectedDate="{Binding ToDate,Mode=TwoWay}"/>

代码:

    private DateTime _FromDate= DateTime.Today.AddDays(-1);
    public DateTime FromDate
    {
        get { return _FromDate; }
        set
        {
            if (_FromDate != value)
            {
                _FromDate = value;
                if (value > _ToDate)
                {
                    _ToDate = value;
                    OnPropertyChanged("ToDate");
                }
            }
            OnPropertyChanged("FromDate");
        }
    }

    private DateTime _ToDate = DateTime.Today;
    public DateTime ToDate
    {
        get { return _ToDate; }
        set
        {
            if (_ToDate != value)
            {
                _ToDate = value;
                if (value < _FromDate)
                {
                    _FromDate = value;
                    OnPropertyChanged("FromDate");
                }
            }
            OnPropertyChanged("ToDate");

        }
    }