2009-04-02 7 views
3

J'essaie de créer un gui qui inclut la modification d'une valeur DateTime d'un objet. La propriété DateTime a une liaison à un DataPicker et un TextBox normal pour l'heure. Lorsque je change la valeur dans le TextBox Time la valeur wirtten dans la propriété DateTime est Today avec l'heure entrée au lieu de simplement mettre à jour l'heure, en conservant la date d'origine.Lier la date et l'heure aux champs d'édition de date et d'heure

Comment est-ce que je peux implémenter un Time TextBox qui change seulement l'heure de DateTime mais pas la date?

actuelle Reliure:

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

Répondre

4

La seule façon que je pouvais penser à le faire est d'avoir une propriété DateTime où vous permettez que le poseur changer le temps.

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# Code derrière:

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

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

C# TestClass où la restriction setter de propriété est utilisé:

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

J'étendu la solution sipWiz un peu, mais je l'ai laissé tout dans ma classe de modèle

J'ai créé deux champs 1. StartDay 2. StartTime qui accèdent tous deux à mon principal domaine StartDate behid les scènes.

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); 
    } 
} 

Ensuite, vous pouvez lier le DatePicker au champ de jour et la zone de texte dans le champ de temps avec StringFormat = « HH: mm ».

Questions connexes