【问题标题】:Datepicker double SelectedDateChanged event when typing date only仅键入日期时的 Datepicker double SelectedDateChanged 事件
【发布时间】:2013-10-11 20:50:34
【问题描述】:

我有一些代码具有意外行为,具体取决于您使用 DatePicker 控件的方式。如果您通过鼠标选择日期来使用 DatePicker,则事件会被触发一次并且代码可以正常工作。但是,如果您输入日期,则事件会触发两次。 这是我的 xaml 代码。

<DatePicker Margin="0,-1,0,0" Height="23" VerticalAlignment="Top"    HorizontalAlignment="Right" Width="190" SelectedDate="{Binding DaDate}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectedDateChanged">
            <i:InvokeCommandAction Command="{Binding SelectedDaDateChangedCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DatePicker>

还有 c# 位。

public ICommand SelectedDaDateChangedCommand { get; set; }
private DateTime? daDate;
public DateTime? DaDate
{
    get { return daDate; }
    set
    {
        daDate = value;
        NotifyOfPropertyChange(() => DaDate);
    }
}

public MisoConstraintsViewModel(IView v) : base(v)
{
    //This is where DoStuff() gets called twice from the SelectedDateChanged
    SelectedDaDateChangedCommand = new RelayCommand(p => DoStuff());
}

感谢任何帮助。谢谢。

【问题讨论】:

  • 什么时候被调用两次?你确定这不是因为输入时进行了 2 次更新 - 一次更改月份,一次更改日期 - 这很常见...
  • 启动日期设置为 2013 年 10 月 9 日,然后我点击它并将其更改为 10/8/2013 并点击进入。每次看起来都会导致双重加载事件。

标签: c# wpf mvvm triggers datepicker


【解决方案1】:

这是一种响应式方法,如果您不想使用响应式,则可以将相同的概念用于事件。从文本框中修改 DatePicker 时会触发两次,因为它会在文本框中提交编辑时触发 SelectedDateChanged,并且在日历设置选定日期时再次触发。我扩展了课程以便能够订阅一些我可以控制的东西。

我知道这是一个旧线程,希望这对仍在寻找答案的人有所帮助。

class CustomDatePicker : DatePicker
{

    private DateTime comparer;
    private Subject<DateTime> dateChangedSubject = new Subject<DateTime>();

    static CustomDatePicker()
    {
        // Override property changed callback for SelectedDate
        DatePicker.SelectedDateProperty.OverrideMetadata(typeof(CustomDatePicker), new FrameworkPropertyMetadata(SelectedDate_PropertyChanged));
    }

    /// <summary>
    /// Subscribe to this observable instead of SelectedDateChanged event
    /// It will only fire once when the selected date changes
    /// </summary>
    public IObservable<DateTime> DateChanged
    {
        get { return this.dateChangedSubject.AsObservable(); }
    }

    /// <summary>
    /// Checks if the comparer is equal to the new value
    /// If it is not, store the new value and fire changed subject
    /// </summary>
    /// <param name="d"></param>
    /// <param name="e"></param>
    private static void SelectedDate_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        CustomDatePicker datePicker = d as CustomDatePicker;

        if(datePicker.comparer != (DateTime)e.NewValue)
        {
            datePicker.comparer = (DateTime)e.NewValue;
            datePicker.dateChangedSubject.OnNext((DateTime)e.NewValue);
        }
    }
}

可以这样使用:

customDatePicker.DateChanged.Subscribe(_ =>
{
    Console.WriteLine("DateChanged fired");
});

// use the passed DateTime value to do something
customDatePicker.DateChanged.Subscribe(dt =>
{
    //... do something with dt
});

【讨论】:

    【解决方案2】:

    如果我没记错的话,DaDate 属性会连续设置两次。我建议检查以前的值

    public DateTime? DaDate
    {
     get { return daDate; }
     set
     {
        if(value != daDate)
        {
         daDate = value;
         NotifyOfPropertyChange(() => DaDate);
        }
     }
    }
    

    这无助于找出原因,但可能可以解决您的问题

    【讨论】:

    • 不,改变这个没有帮助。关于 datepicker 的所有内容都可以正常工作,并且如果不输入它,则可以按预期工作,所以我不相信该属性被设置了两次。手动输入日期并触发 datechanged 事件两次时只有一个“错误”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多