我正在尝试构建一个包含编辑对象的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>
答案 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”。