簡體   English   中英

WPF綁定定期更新

[英]Wpf binding update regularly

我有一個運行很長時間的復雜后端流程。 設置這些屬性時,所有重要統計信息都會作為屬性公開,並帶有INotifyPropertyChanged事件。

我想添加一個“經過的時間”,事實證明這比預期的要困難得多。

我公開了一個ProcessStartedAt DateTime,並把一個轉換器放在一起,以便從DateTime.Now減去綁定時間。 這完美(一次)。 此后,由於屬性未更改,因此綁定永遠不會更新,並且不會再次調用轉換器。

我不希望后端有專門用於更新“經過的時間”屬性的計時器。 它違反了關注點分離原則。 我會更喜歡UI中的計時器,但不確定如何在不更新屬性值的情況下強制刷新綁定。

更好的是,有什么方法可以告訴綁定定期刷新嗎?

<TextBlock Text="{Binding Path=ProcessStartedAt,
                          Converter={StaticResource ElapsedTime}}"/>

我會在ValueConverter類中放入計時器,並在每次命中間隔時引發一個事件以調用Convert方法。

這使ValueConverter始終專注於其責任。

無需轉換器,只需在getter上通知延遲:

public string RemainingTime
{
    get {
           Task.Delay(1000).
           ContinueWith(w => OnPropertyChanged(() => RemainingTime));
           return (CurrentServerTime - SelectedDeliveryTime).ToString("mm\\:ss");
        }
}

由於OnPropertyChange,將撤回該綁定

“我有一個復雜的后端流程,需要長時間運行。” 和“我不希望后端有專門用於更新“經過時間”屬性的計時器。” 似乎適得其反。

嘗試不使用您的視圖模型更新視圖似乎違反了某些MVC原則。 假設您找到了一種方法,以下工程師/開發人員可能沒有。

也許您應該找到一種及時更改視圖模型類的方法,而不是試圖及時“阻止”更新。 這樣,您就不必擔心事物如何更新。 取而代之的是,您將以一種易於理解的方式將更改“應用”到您的視圖模型 ,以便將來進行更改,並且還可以在應用更新框架時更新技術。

編輯

我猜唯一的方法是設置一個DispatcherTimer,訂閱它並調用OnPropertyChanged。 與您的問題無關,但是如果需要,您還可以在“綁定”中添加“延遲”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM