2009-04-02 7 views
3

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

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

Текущий Переплет:

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

ответ

4

Единственный способ, которым я мог думать, чтобы сделать это, чтобы иметь свойство 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; 
     } 
    } 

С # 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

Я продлил решение sipWiz немного, но я оставил все это в моей модели классе

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

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: мм».