2016-10-18 34 views
1

私のアプリケーションにDatePickerがあります。私は(例えばddmmrrrr、DDMM、ddmmrr ...) 私が作ったDateTimeConverterをカレンダーから(例えば2016年10月18日)、選択したDateTimeをスタンダールDateTime書式を書いたり、カスタムフォーマットを書きたいと思います:WPF DatePicker - カスタム日時書式を書き込む

class DateTimeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     DateTime emptyDateTime; 
     if (DateTime.TryParse(value.ToString(), out emptyDateTime) && emptyDateTime == DateTime.MinValue) 
      return DateTime.Now; 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     int valueNumber; 
     string valueStr = value.ToString().Replace(".", ""); 
     if (!int.TryParse(valueStr, NumberStyles.Integer, CultureInfo.InvariantCulture, out valueNumber)) 
      return DateTime.Now; 
     if (valueStr.Length == 8) //format ddmmrrrr 
     { 
      DateTime emptyDateTime; 
      //for removing empty datetime (01.01.0001) 
      return DateTime.TryParse(value.ToString(), out emptyDateTime) && emptyDateTime == DateTime.MinValue 
       ? (object) null 
       : new DateTime(valueNumber%10000, (valueNumber/10000)%100, valueNumber/1000000); 
     } 
     if (valueStr.Length == 6) //format ddmmrr 
      return new DateTime(2000 + valueNumber % 100, (valueNumber/100) % 100, valueNumber/10000); 
     if (valueStr.Length == 4) //format ddmm 
      return new DateTime(DateTime.Now.Year, valueNumber % 100, valueNumber/100); 
     return DateTime.Now; 
    } 
} 

をそして、これはあります私の日付ピッカー:

<DatePicker Focusable="True" Grid.Column="4" 
          Text="{Binding Order.DateTime, Mode=TwoWay, Converter={StaticResource DateTimeConverter}}" 
          PreviewKeyDown="DatePicker_OnPreviewKeyDown"/> 

これは結合のためのプロパティです:

class Order{ 
    public DateTime DateTime { get; set; } 
} 

は私の問題は、以下のとおりです。 日付ピッカーがnullの場合は、Order.DateTimの値eは01.01.0001です。 フォーマット(ddmmrrrr)を書き込むと、Order.DateTimeの値はDateTime.Nowになります。

どうしたらいいですか。ありがとう

答えて

1

あなたのConverterTryParseを間違って確認します。それを次のように変更してください:

if (!DateTime.TryParse(value.ToString(), out emptyDateTime) || emptyDateTime == DateTime.MinValue) 
     return DateTime.Now; 

return value; 
+1

ただし、&&を||に変更する必要があります。文字列を解析できないか、解析できないのにDateTime.MinValueだった場合、DateTime.Nowを返す必要があります – Woozar

+1

@Woozar:ありがとう、私は答えを更新しました – WPFGermany

+0

ありがとうございました。しかし、初期値は01.01.0001です。あなたの例でDateTime.Nowを返すことはありませんが、戻り値。 – bluray

関連する問題