我有以下日期选择器:
<xctk:DateTimePicker HorizontalAlignment="Right" Margin="0,23,671,0" Name="datepicker" VerticalAlignment="Top" Width="120" Height="49" BorderBrush="Black" Cursor="Hand" ValueChanged="dateTimePicker1_ValueChanged" />
现在你可以看到component有一个valueChanged事件。事件代码如下所示:
private void dateTimePicker1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
DateTime date = (DateTime)datepicker.Value;
datepicker.Text = date.Date.ToString();
UpdateDateLabels(date);
}
private void UpdateDateLabels(DateTime date)
{
dstart.Content = date.Date.ToShortDateString();
switch (datebox.SelectedIndex)
{
case 0:
date.AddDays(1);
break;
case 1:
date = date.AddDays(7);
break;
case 2:
date = date.AddMonths(1);
break;
case 3:
date = date.AddYears(1);
break;
default:
break;
}
MessageBox.Show(datebox.SelectedValue.ToString());
dend.Content = date.Date.ToShortDateString();
}
现在你们中的一些人可能知道一个日期选择器看起来像这样:
现在当我点击箭头键(向上和向下)时,一切正常。但是,如果我点击按钮查看日历,那么changedevent已经被触发而没有实际更改(在我收到以下错误之前我甚至没有看到日历):
谁能告诉我为什么会这样?
答案 0 :(得分:1)
您应该检查OriginalSource
。
试试这个:
private void dateTimePicker1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (e.OriginalSource is Xceed.Wpf.Toolkit.DateTimePicker)
{
DateTime date = (DateTime)datepicker.Value;
datepicker.Text = date.Date.ToString();
UpdateDateLabels(date);
}
}
答案 1 :(得分:0)
我会选择“教人钓鱼”的答案。
回答“为什么会发生这种情况?”的最佳方法。问题往往是看你的调用堆栈。如果它显示一行[]你[b] NEED [/ b]在调试选项中关闭Just My Code(选项 - &gt;调试 - &gt;取消选中“启用我的代码”。
执行此操作后,您应该会看到一个信息量更大的调用堆栈,其中发生异常。
我猜你会猜到你会看到一堆Binding调用,可能是你点击那个按钮时显示的新编辑器。建立绑定时,通常会抛出值更改事件,即使值未更改。
所以,根据@ kmatyaszek的回答,您需要确保在需要时只处理事件。