2013-10-11 46 views
0

我有一些代碼具有意外的行爲,具體取決於您如何使用DatePicker控件。如果您通過鼠標選擇日期來使用DatePicker,則該事件將被觸發一次並且代碼正常工作。儘管如果您輸入事件觸發兩次的日期。 這是我的xaml代碼。Datepicker double僅在輸入日期時發生SelectedDateChanged事件

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

任何幫助表示讚賞。謝謝。

+0

當它獲取調用兩次?你確定這不是因爲在輸入時進行了2次更新 - 一次當你改變月份,一次當你改變日期 - 這很常見... – Vivek

+0

開始日期設置爲10/9/2013,然後我點擊進入它並將其更改爲10/8/2013並單擊輸入。每次看起來都會導致雙重加載事件。 – Kohins

回答

0

如果我找到了你,DaDate屬性連續設置兩次。我會建議檢查前值

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

這不會有助於找出病因,但可能可以解決你的問題

+0

不改變這並沒有幫助。關於datepicker的一切工作正常,如果沒有輸入它,所以我不相信該屬性設置兩次。在手動輸入日期和觸發datechanged事件兩次時只有一個「bug」。 – Kohins

1

這是一個被動的做法,相同的概念可以用事件,如果使用你不希望使用被動的。 DatePicker在從文本框中修改時會觸發兩次,因爲它會在文本框中提交編輯時觸發SelectedDateChanged,而當日歷設置選定日期時會再次觸發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 
}); 
相關問題