0

在我的ViewModel中,我有兩種屬性類型的Datetime。它們以雙向模式綁定在XAML中。當我更新它們中的每一個時 - OnPropertyChanged在此Datetime屬性的集合部分中引發第三個屬性。所以我想在更新兩個Datetime屬性的同時更新第三個屬性,而不是更新第三個屬性兩次。如何實現它? 代碼施加:更新一次依賴屬性而不是兩次

//1 
public DateTime StartDate 
{ 
    ... 
    set 
    { 
     this.selectedEndDate = value; 
     this.OnPropertyChanged("StartDate"); 
     this.OnPropertyChanged("MyList"); 
    } 
} 
//2 
public DateTime EndDate 
{ 
    ... 
    set 
    { 
     this.selectedEndDate = value; 
     this.OnPropertyChanged("EndDate"); 
     this.OnPropertyChanged("MyList"); 
    } 
} 
//third property 
public IEnumerable<MyObject> MyList 
{ 
    get 
    { 
     return _data.Where(kvp=> kvp.Key.Date >= Start && kvp.Value.Date <= End).Select(kvp => kvp.Value); 
    } 
} 

回答

2

您可以通過啓動一個定時器來延遲MyList屬性更改通知時的日期屬性的變化之一。當兩個屬性同時改變時,這不僅會避免雙重通知,還會在其中一個屬性更改頻​​率過高時防止頻繁通知。

計時器將通過停止並重新啓動它來重置每個屬性更改,因此您可以在實際通知MyList屬性更改之前進行許多後續屬性更改。

下面的代碼示例使用DispatcherTimer來執行此任務。當然,你必須爲Interval找到合理的價值。

private DispatcherTimer notifyTimer; 

public ViewModel() 
{ 
    notifyTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(200) }; 
    notifyTimer.Tick += OnNotifyTimerTick; 
} 

private void OnNotifyTimerTick(object sender, EventArgs e) 
{ 
    OnPropertyChanged("MyList"); 
    notifyTimer.Stop(); 
} 

public DateTime StartDate 
{ 
    ... 
    set 
    { 
     selectedEndDate = value; 
     OnPropertyChanged("StartDate"); 
     notifyTimer.Stop(); 
     notifyTimer.Start(); 
    } 
} 

public DateTime EndDate 
{ 
    ... 
    set 
    { 
     selectedEndDate = value; 
     OnPropertyChanged("EndDate"); 
     notifyTimer.Stop(); 
     notifyTimer.Start(); 
    } 
} 
+0

好主意,在另一個線程@ + 1 – 2013-02-24 04:43:18

+0

好主意! – Buddy 2013-02-24 08:09:33

+0

@DavutGürbüz其實它不是另一個線程,而只是UI線程上的一個定時器。 – Clemens 2013-02-24 11:43:51

0

正如我看到它用戶改變的startDate拳頭結束日期秒。 ?或相反亦然。

下面的代碼有機會,

 bool fistChanged,endChanged; 

     on Ctor (Constructor) 
     this.PropertyChanged+=(s,p)=> 
     { 
       if(p.PropertyName=="firstDate") 
       { 
       firstChanged=true; 
       } 
       if(p.PropertyName=="endDate") 
       { 
       endChanged=true; 
       } 
       if(firstChanged && endChanged) 
       { 
        this.OnPropertyChanged("MyList"); 
        fistChaned=false;endChanged=false; 
       } 
     } 
+0

實際上,這些StartDate和EndDate綁定到RadTimeBar telerik控件的SelectedStartDate和SelectedEndDate。因此,可以更改這些日期之一,例如,我只更改了SelectedStartDate,第三個屬性需要更改爲。 _BUT_當我拖動RadTimeBar的子控件時,所以SelectedStartDate和SelectedEndDate都會在很短的時間內發生變化。更改_BOTH_日期後,我想更新我的第三個屬性。 – Buddy 2013-02-23 14:31:51

+0

我也使用RadTimeBar,RadTimeLine。我的代碼應該可以幫助你。 (我只是編碼Stackoverflow的編輯器)。如果存在拖動操作,您也可以使用事件(例如拖動完成?) – 2013-02-23 14:38:30

+0

我已經爲我的ViewModel添加了_UpdateDates_方法,並在RadTimeBar的_SelectionChanged_事件處理程序中調用它。這個解決方案不太好,但謝謝你的想法。如果任何人都可以提出更好的想法,那將會很棒。 – Buddy 2013-02-23 15:28:40