DateTimePicker + WPF +绑定+通过userinput接受dd / MM / yyyy

时间:2014-11-07 11:13:33

标签: c# wpf datetime datetimepicker

简化问题:

我在WPF中有一个日期选择器。我在datepicker的文本框中输入值30/10/1983。我需要将值发回到我的viewmodel,在哪里我将它绑定到DateTime?属性。

我有什么办法可以做到这一点。 mm / dd / yyyy格式触发回发但不是dd / mm / yyyy。

DatePicker代码如下所示。

<DatePicker Grid.Row="2" Name="inputDate"
                Text="{Binding BirthDate,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                >

</DatePicker>

视图模型属性如下所示。

private DateTime? birthDate;

    public DateTime? BirthDate
    {
        get
        {
            return this.birthDate;
        }
        set
        {
            this.birthDate = value;
            OnPropertyChanged("BirthDate");
        }
    }

我在datepicker文本框中输入值10/10,使用值调用setter,但是当我输入整个日期30/10/1983时,我仍然具有等于NULL的视图模型属性。

我已在日历设置中将格式更改为英语 - 联合王国,而我的CurrentCulture恰当地反映了en-GB。

原始问题:

我在WPF中有一个datetimepicker控件,我已将text属性绑定到视图模型中的Nullable DateTime。

我面临的问题是当我以MM / dd / yyyy格式输入一个值时,我会在视图模型中获得一个值回发值,表示新值。

但是当我以dd / MM / yyyy格式输入值时,我在视图模型中没有收到通知,并且值丢失了。视图模型中的绑定属性为null。

短日期格式是我在日历设置&amp;中指定的格式。 dateFormat,对于短日期格式,我将条目提供为“dd / MM / yyyy”。

有人可以帮我解决这个问题,我在dd / MM / yyyy格式中接受日期,我不想硬编码,我希望从日历设置中选择短日期格式,我也希望也可以在视图模型中接收更新的值。

1 个答案:

答案 0 :(得分:1)

问题是,无效日期不会使用ViewModel DateTime属性设置正确的值。因此,您可以拦截它并使用转换器正确转换。

一个例子:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string strValue = System.Convert.ToString(value);
        DateTime resultDateTime;
        if (DateTime.TryParse(strValue, out resultDateTime))
        {
            return resultDateTime;
        }
        return value;    
    }

您的XAML代码将如下:

 <DatePicker 
     Text="{Binding BirthDate,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
     SelectedDate="{Binding RelativeSource={RelativeSource Self},Path=Text,
     Converter={StaticResource DateConverter}}"
  />