0

我有以下日期选择器:

<xctk:DateTimePicker HorizontalAlignment="Right" Margin="0,23,671,0" Name="datepicker" VerticalAlignment="Top" Width="120" Height="49" BorderBrush="Black" Cursor="Hand" ValueChanged="dateTimePicker1_ValueChanged" />

现在你可以看到组件有一个 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 已经被触发而没有实际更改(在出现以下错误之前我什至看不到日历):

错误

谁能告诉我为什么会这样?

4

2 回答 2

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);
    }
}
于 2013-07-29T13:43:19.350 回答
0

我会去找“教人钓鱼”的答案。

回答“为什么会这样?”的最佳方式。问题通常是查看您的调用堆栈。如果它显示一行说 [] 你 [b] 需要 [/b] 在调试选项中关闭仅我的代码(选项->调试->取消选中“启用我的代码”。

完成此操作后,您应该会在发生异常的位置看到信息量更大的调用堆栈。

我猜你会在其中看到一堆 Binding 调用,可能是你点击那个按钮时显示的新编辑器。绑定建立时经常会抛出值改变事件,即使值没有改变。

因此,根据@kmatyaszek 的回答,您需要确保仅在需要时处理事件。

于 2013-07-29T14:36:57.870 回答