【问题标题】:Custom date format for textbox文本框的自定义日期格式
【发布时间】:2016-03-19 01:02:29
【问题描述】:

相关:Binding 3 textboxes together; same DateTime different format

我有三个textboxes,都应该在同一个日期绑定在一起。其中两个具有正常的字符串格式。第三个的特定格式为yyyy,jjj/HHmmss。我不知道如何将这个 textbox 绑定到我拥有的自定义格式,并且如果我更改其中的任何日期值,另一个 textboxes 将更新,反之亦然。

private DateTime _dateInViewModel;
public DateTime DateInViewModel
{
    get { return _dateInViewModel; }
    set
    {
        _dateInViewModel = value;
        NotifyPropertyChanged("DateInViewModel");
    }
}

<TextBox Name="SDate1" Text="{Binding DateInViewModel, StringFormat='MM/dd/yyyy'}" />
<TextBox Name="SDate2" Text="{Binding DateInViewModel}" />
<TextBox Name="STime1" Text="{Binding DateInViewModel, StringFormat='hh:mm:ss'}" />

自定义格式可以如下:

format = String.Format("{0},{1}/{2}",
                                DateInViewModel.Year,
                                DateInViewModel.DayOfYear.ToString("d3"),
                                DateInViewModel.ToString("HHmmss"));

目前,只有SDate1STime1 可以正确绑定并在对方更改时更新。

我做了一个转换器。当 SDate1STime1 更改时,它会正确更新 SDate2,但在编辑 SDate2 以更新其他时不起作用。

public class DateTimeConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            DateTime test = (DateTime)value;
            string date = String.Format("{0},{1}/{2}",
                                            test.Year,
                                            test.DayOfYear.ToString("d3"),
                                            test.ToString("HHmmss"));
            return (date);
        }
        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

【问题讨论】:

  • 您展示的是尝试从部分构造字符串,实现自定义格式。如果你可以创建返回你想要的格式字符串,你可以把它放在绑定中
  • 等等,我可以把上面的string.format 放在xaml 中??我没想到我可以把DateTime之类的.Year, .DayOfYear等方法放在xaml中。
  • 不,您对 String.Format 所做的实际上是从 3 个不同的值创建一个字符串。我看到问题是 DateOfYear,这意味着您无法创建这样的格式字符串。正如其他人回答的那样,如果您希望解析文本框数据并更新 ViewModel,则需要 ConvertBack 方法

标签: c# wpf string-formatting date-formatting


【解决方案1】:

您需要在转换器中重新设置转换。这只是一个示例,但您需要将值解析回原始源,以便可以更新其他绑定。

由于您的格式是{0},{1}/{2},因此您需要将其拆分备份并重建预期的日期。

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value == null) return null;
    string strValue = value.ToString();
    if (string.IsNullOrEmpty(strValue) && targetType == typeof(DateTime?))
    {
        return null;
    }
    else if (string.IsNullOrEmpty(strValue))
    {
        return DateTime.MinValue;
    }

    //year,dayOfYear/Time(HHmmss)
    var parts = strValue.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    if (parts.Length == 2) {
        var year = parts[0];
        parts = parts[1].Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
        if (parts.Length == 2) {
            var days = parts[0];
            var time = parts[1];

            var date = new DateTime(int.Parse(year), 1, 1)
                            .AddDays(int.Parse(days))
                            .Add(TimeSpan.Parse(time));
            return date;
        }
    }

    DateTime resultDateTime;
    return DateTime.TryParse(strValue, out resultDateTime) ? resultDateTime : value;
}

【讨论】:

  • 谢谢。实际上在另一个类中有一个方法可以进行转换。刚刚粘贴了它,它现在似乎可以工作了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多