将DateTime绑定到日期和时间EditFields

时间:2009-04-02 08:45:14

标签: c# .net wpf datetime data-binding

我正在尝试构建一个包含编辑对象的DateTime值的gui。 DateTime属性已绑定到DataPicker和Time的常规TextBox。 当我更改时间文本框中的值时,DateTime属性中的值wirtten是今天的输入时间,而不是仅更新时间,保留原始日期。

如何实现仅更改DateTime时间而不更改日期的Time TextBox?

当前约束:

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

2 个答案:

答案 0 :(得分:4)

我能想到的唯一方法就是拥有一个DateTime属性,你只允许setter改变时间。

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

答案 1 :(得分:2)

我扩展了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绑定到day字段,将TextBox绑定到时间字段,使用StringFormat =“HH:mm”。