Привязать DateTime к дате и времени EditFields - PullRequest
3 голосов
/ 02 апреля 2009

Я пытаюсь создать графический интерфейс, который включает в себя редактирование значения DateTime объекта. Свойство DateTime имеет привязку к DataPicker и обычному TextBox для времени. Когда я изменяю значение в текстовом поле Time, значение wirtten в свойстве DateTime равно Today с введенным временем вместо простого обновления времени с сохранением исходной даты.

Как я могу реализовать TextBox Time, который только изменяет время DateTime, но не дату?

Текущая привязка:

<TextBlock>Time</TextBlock>
<TextBox Template="{StaticResource RoundedTextBoxTemplate}">
    <Binding Path="Delivery.Date" StringFormat="HH:mm">
        <Binding.ValidationRules>
            <v:IsValidTimeRule />
        </Binding.ValidationRules>
    </Binding>
</TextBox>

Ответы [ 2 ]

4 голосов
/ 02 апреля 2009

Единственный способ, которым я мог придумать, это иметь свойство DateTime, в котором вы только позволяете установщику изменять время.

XAML:

<UserControl.Resources> 
    <mine:DateTimeConverter x:Key="MyDateTimeConverter" />
</UserControl.Resources>    
<Grid x:Name="LayoutRoot">
    <TextBox x:Name="myTextBox" Text="{Binding Path=TestDateTime, Converter={StaticResource MyDateTimeConverter}, Mode=TwoWay}" />
</Grid>

C # Код:

 public partial class Page : UserControl
 {
      private TestClass m_testClass = new TestClass();

      public Page()
      {
           InitializeComponent();
           myTextBox.DataContext = m_testClass;
      }
  }

C # TestClass, где используется ограничение установщика свойства:

public class TestClass : INotifyPropertyChanged
{
    private DateTime m_testDateTime = DateTime.Now;
    public DateTime TestDateTime
    {
        get { return m_testDateTime; }
        set
        {
            m_testDateTime = m_testDateTime.Date.Add(value.TimeOfDay);
            PropertyChanged(this, new PropertyChangedEventArgs("TestDateTime"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = (t, e) => {};
}

C # IValueConverter:

public class DateTimeConverter : IValueConverter
{
    public object Convert(object value,
                       Type targetType,
                       object parameter,
                       CultureInfo culture)
    {
        DateTime date = (DateTime)value;
        return date.ToString("HH:mm");
    }

    public object ConvertBack(object value,
                              Type targetType,
                              object parameter,
                              CultureInfo culture)
    {
        string strValue = value.ToString();
        DateTime resultDateTime;
        if (DateTime.TryParse(strValue, out resultDateTime))
        {
            return resultDateTime;
        }
        return value;
    }
}
2 голосов
/ 02 ноября 2009

Я немного расширил решение sipWiz, но оставил все это в своем классе Model

Я создал два поля 1. StartDay 2. StartTime, которые оба обращаются к моему первичному полю StartDate среди сцен.

public DateTime? StartTime
{
    get
    {
        return StartDate;
    }
    set
    {
        if (StartDate == null) StartDate = DateTime.Today;
        StartDate = StartDate.Value.Date.Add(value.HasValue ? value.Value.TimeOfDay: TimeSpan.Zero);
    }
}
public DateTime? StartDay
{
    get { return StartDate; }
    set
    {
        DateTime BaseDate = value.HasValue ? value.Value : DateTime.MinValue;
        StartDate = BaseDate.Date.Add(StartDate.HasValue ? StartDate.Value.TimeOfDay : TimeSpan.Zero);
    }
}

Затем вы можете привязать DatePicker к полю дня и TextBox к полю времени с помощью StringFormat = "HH: mm".

...