簡體   English   中英

如何區分依賴屬性的變化是從類內部還是外部

[英]How to distinguish between Dependency Property change from inside the class, or outside

我正在創建一個 WPF 自定義控件。 該控件是一個時間選擇器。 它存在一個包含表示用戶輸入時間的字符串的TextBox (如 16:35)。 聚焦該文本框時,將打開一個Popup窗口,其中包含兩個單獨的小時和分鍾文本框,以便於輸入。

在此處輸入圖片說明

彈出的 TextBoxes 和主字段 TextBox 應該同步。 我的意思是,當用戶通過單擊箭頭鍵或在小小時字段中鍵入來更改小時時,主文本框(包含文本 16:35)應該更新,反之亦然。 彈出窗口中的字段僅限於接受 [0-9] 個字符。 當主 TextBox 時間字符串更改時,將解析字符串並更新 Popup 中的兩個字段。 如果用戶在主 TextBox 中鍵入無效的時間字符串並且控件無法從中提取小時和分鍾以更新 Popup TextBoxes,那么我什么都不做。

彈出窗口中的箭頭按鈕綁定到命令。

我只使用自定義控件的類。 我沒有附加任何 DataContext,我只想使用依賴屬性。

我的控件有多個依賴屬性,包含我的控件的用戶視圖應該使用以下依賴屬性:

  • TimeSpan類型的時間

對於內部工作,我還有一些依賴屬性:

  • 字符串類型的Hour (與彈出窗口中的小時文本框綁定)
  • Minute類型的字符串(在彈出分鍾文本框結合)
  • 字符串類型的TextBoxText (與主 TextBox 綁定)

我的問題示例:

當用戶更改任何字段時,必須同步總控制字段。 因此,如果 Popup 的小時字段中的文本更改,則主字段的時間字符串也會更改。 我通過使用依賴屬性元數據中定義的依賴屬性更改回調來做到這一點。 但問題是,使用此回調時,您不知道更改是來自控件模板(直接來自用戶的操作)還是來自設置 DP 值的類本身)。 這會導致惡性循環,您很快就會失去概覽。 不是我的程序崩潰了,而是出現了問題,例如 DP 更新了兩次以及那種不需要的行為。

  1. 用戶在其中鍵入時間字符串更改了 TextBoxText (12:45)
  2. DP回調被調用是因為TextBoxText DP改變了它的值,所以控件想要更新Popup中的TextBoxes
  3. 解析 TextBoxText 字符串並將 DP 小時和分鍾設置為新值。
  4. DP 小時回調被調用,DP 分鍾回調被調用。
  5. 在此 Hour 和 Minute DP 回調中,必須更新 TextBoxText -> 導致循環(參見步驟 2)。 因為它不區分“外部”(使用控件的視圖用戶)或“內部”(更改其自己的 DP 的控件類)的更改。

如何解決這個問題? 任何有這方面經驗的人或者我做錯了什么?

這就是我大部分時間處理它的方式:

偽代碼:

callback(){
   if(flag){
      it's coming from program
   }
   else{
      it's coming from user
   }
}

button_event_handler(){
   flag = true
   do_stuff()
   flag = false
}

但是,如果這不適用於您的代碼,還有其他方法可以做到這一點。

例如,在復雜值(如日期時間的一部分)的情況下,您可以將實際 DateTime 存儲在通過轉換器綁定到每個控件的屬性中。 它必須是單射的,否則整個事情都會以循環結束。 單射是指 updown 控件的每個狀態必須只有文本框的一種狀態,反之亦然。

暫無
暫無

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

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