2016-03-18 3 views
2

по теме: 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")); 

Прямо сейчас, только SDate1 и STime1 связываются друг с другом должным образом и обновления, когда другой изменяется.

Я сделал преобразователь. Он правильно обновляет SDate2, когда SDate1 и STime1 изменены, но не работают при редактировании 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 
} 

+0

То, что вы показываете, является попыткой построить строку из частей **, а не ** реализовать собственный формат. Если вы * можете * создать строку формата, которая возвращает то, что вы хотите, вы можете просто поместить ее в привязку –

+0

Подождите, так что я могу просто поместить 'string.format' у меня выше в xaml ?? Я не думал, что могу использовать методы 'DateTime' как' .Year, .DayOfYear' и т. Д. В xaml. – pfinferno

+1

no, что вы делаете с String.Format на самом деле создает строку из 3 разных значений. Я вижу, что проблема DateOfYear, а это значит, что вы просто не можете создать такую ​​строку формата. Однако, как и другие, если вы хотите, чтобы данные текстового поля обрабатывались и обновляли ViewModel, вам нужен метод ConvertBack –

ответ

7

Вы должны установить обратное преобразование в преобразователе. Это всего лишь пример, но вам нужно проанализировать значение обратно в исходный источник, чтобы можно было обновить другие привязки.

Поскольку ваш формат {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; 
} 
+0

Спасибо. На самом деле был метод в другом классе, который преобразовывал обратно. Просто вложил его и, похоже, теперь работает. Спасибо! – pfinferno

+0

Хорошо круто. добавила его на всякий случай. – Nkosi

Смежные вопросы