2013-01-31 28 views
2

我在我的C#4.0(WPF)應用程序中有一個日期選擇器,我想將文本框中可見的日期格式更改爲yyyy/MM/dd。現在我看到格式dd/MM/yyyy。c#和日期選擇器,如何更改格式?

在我的日期選擇器的axml我有這樣的代碼:

<DatePicker Height="25" HorizontalAlignment="Left" Margin="5,36,0,0" Name="dtpStartDate" 
        SelectedDate="{Binding StartDateSelectedDate}" VerticalAlignment="Top" Width="115"> 
      <DatePicker.Resources> 
       <Style TargetType="{x:Type DatePickerTextBox}"> 
        <Setter Property="Control.Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <TextBox x:Name="PART_TextBox" 
            Text="{Binding Path=SelectedDate, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}, StringFormat={}{0:yyyy/MM/dd}}" /> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </DatePicker.Resources> 
     </DatePicker> 

這似乎在第一時間,所有工作正常,我可以看到我想要的格式的日期,我可以改變手動日期或使用日曆,並且在兩種方式中,到達viewModel的日期都是正確的。

但我有一個問題,因爲我想檢測,如果日期是空的,在我的視圖模型控制這種情況。但是,如果我清除日期選擇器,在我的視圖模型到達最後正確的日期,所以我不能檢查日期是否爲空。

那麼如何修改日期選擇器中的日期格式並控制日期是否爲空或空?

謝謝。 Daimroc。

回答

5

您可以嘗試以下解決方案。

首先創建以下轉換器:

public class StringToDateTimeConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) 
     { 
      return null; 
     } 
     return ((DateTime)value).ToString(parameter as string, CultureInfo.InvariantCulture); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (string.IsNullOrEmpty(value as string)) 
     { 
      return null; 
     } 
     try 
     { 
      DateTime dt = DateTime.ParseExact(value as string, parameter as string, CultureInfo.InvariantCulture); 
      return dt as DateTime?; 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
    } 
} 

然後在XAML中,你必須創建一個轉換器的實例,並在的的DatePicker

<Window x:Class="TestDatePicker.MainWindow" 
    ... 
    xmlns:converters="clr-namespace:TestDatePicker" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    ... 
    <converters:StringToDateTimeConverter x:Key="StringToDateTimeConverter" /> 
</Window.Resources> 
<Grid DataContext="{StaticResource MainWindowVM}"> 
    ... 
    <DatePicker Height="25" HorizontalAlignment="Left" Margin="5,36,0,0" Name="dtpStartDate" 
       SelectedDate="{Binding StartDateSelectedDate}" VerticalAlignment="Top" Width="115"> 
     <DatePicker.Resources> 
      <Style TargetType="{x:Type DatePickerTextBox}"> 
       <Setter Property="Control.Template"> 
        <Setter.Value> 
         <ControlTemplate> 
          <TextBox x:Name="PART_TextBox" 
           Text="{Binding Path=SelectedDate, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}, Converter={StaticResource StringToDateTimeConverter}, ConverterParameter=yyyy/MM/dd}" /> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </DatePicker.Resources> 
    </DatePicker> 
    ... 
</Grid> 

文本框中使用

最後,在viewmodel中,屬性必須是DateTime類型? (即可以爲空的DateTime)。

private DateTime? _startDateSelectedDate; 
    public DateTime? StartDateSelectedDate 
    { 
     get { return _startDateSelectedDate; } 
     set 
     { 
      if (_startDateSelectedDate != value) 
      { 
       _startDateSelectedDate = value; 
       RaisePropertyChanged(() => this.StartDateSelectedDate); 
      } 
     } 
    } 

我希望這將有助於你

問候

克勞德

+0

但在視圖模型的StartDateSelectedDate屬性使用系統的日期格式,StartDateSelectedDate財產應當使用獲得自定義格式。當我的電腦格式是「dd/MM/yyyy」,我想在viewmodel屬性中輸入「MM/dd/yyyy」呢? –

2

默認情況下,DateTimerPicker不支持空值。

也許this post與MSDN具有相同的主題可以幫助您。

在那裏你會發現其他的想法如何實現它或一些代碼項目的可空日期時間選擇器。