2009-04-02 8 views
3

ich versuche, eine GUI zu erstellen, die das Bearbeiten eines DateTime-Wertes eines Objekts enthält. Die DateTime-Eigenschaft hat eine Bindung an einen DataPicker und eine normale TextBox für die Zeit. Wenn ich den Wert in der Time TextBox ändere, ist der Wert in der DateTime-Eigenschaft Heute mit der eingegebenen Zeit, anstatt nur die Zeit zu aktualisieren und das ursprüngliche Datum beizubehalten.Zeit bis Datum und Uhrzeit binden EditFields

Wie kann ich eine Time TextBox implementieren, die nur die DateTime-Zeit, aber nicht das Datum ändert?

Aktuelle Bindung:

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

Antwort

4

Der einzige Weg, die ich denken könnte, es zu tun eine Datetime-Eigenschaft zu haben ist, wo Sie die Setter nur erlauben, die Zeit ändern.

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 hinter:

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

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

C# Testclass, wo die Eigenschaft Setter Einschränkung verwendet wird:

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

I sipWiz-Lösung ein wenig erweitert, aber ich ließ es alles in meinem Modell Klasse

ich zwei Felder erstellt 1. StartDay 2. StartTime, die sowohl meine primäre Feld behid die Kulissen StartDate zugreifen.

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

Dann können Sie die Datepicker auf den Tag Feld binden und die TextBox auf das Zeitfeld mit String = „HH: mm“.