2012-02-25 78 views
2

如果我們有約束「雙向」的時間跨度財產上的視圖模型組合框,以及轉換器改變時間跨度視圖模型屬性設置爲一個字符串,增加了對分鐘「M」,然後當編輯組合框的值從10m到5時,我預計:奇怪的組合框的行爲

WPF綁定調用ConvertBack以獲取更新源屬性的值 - 假設這是5分鐘的時間範圍。

視圖模型的時間跨度屬性setter被調用並設置基礎字段(從10至5的入庫時間變化的),然後使OnPropertyChanged

WPF綁定接收事件,因此調用其處理方法,其中首先進行轉換爲該值,然後將此'5m'轉換後的值設置爲目標文本屬性

除了最後一步沒有發生,並且comboxbox仍然保持在5.我實際上想要這種行爲,但想知道爲什麼最後一步不會發生。奇怪的是改變到一個文本框確實給我預期(更新5立即5M)

編輯的行爲:原題錯誤陳述文本框,我應該寫的ComboBox

UPDATE:使用snoop實用程序,我看ComboBox的文本屬性確實變成了5米,但顯示仍然是5 - 我只能假設如果組合框正在被編輯,它不會刷新它的文本顯示。使用轉換器將問題標題從「WPF數據綁定目標 - 源 - 目標週期」更改爲更準確地反映現在的情況。

回答

0

轉換器的ConvertBack方法將只設置綁定源屬性的值,那麼您的目標屬性(即ypur TextBox的文本)將不會被更新。如果是這樣,那麼每次綁定模式時都會有無限循環的綁定將是TwoWay.Convert方法,當源屬性發生更改時會調用此方法,並且在綁定的目標屬性發生更改時調用ConvertBack。希望這會有所幫助。

+0

謝謝 - 我認爲'無限循環'是通過檢查,以避免更新目標或源之前屬性值是否已更改。這是雙向綁定,我的問題是關於不更新目標的轉換方法。 – sturdytree 2012-02-25 07:42:21

2

你能告訴你在哪裏面臨這個問題,示例代碼,因爲此示例代碼對我的作品 -

XAML:

<TextBox Text="{Binding Time, Converter={StaticResource MyConverter}}"/> 

物業

public TimeSpan Time 
{ 
    get 
    { 
     return time; 
    } 
    set 
    { 
     if (time != value) 
     { 
     time = value; 
     OnPropertyChanged("Time"); 
     } 
    } 
} 

轉換器

public class MyConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value is TimeSpan) 
      { 
       return ((TimeSpan)value).Minutes.ToString() + "m"; 
      } 
      return String.Empty; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value is string) 
      { 
       return new TimeSpan(0, System.Convert.ToInt32(value), 0); 
      } 
      return new TimeSpan(); 
     } 
    } 
+0

非常感謝 - 我實際上已改爲組合框,並獲得所描述的行爲(抱歉應該說明這一點,出於某種原因,我在我的腦子文本框);改回到一個文本框給出了與你的代碼相同的行爲(我的代碼與你的代碼非常相似)。任何想法爲什麼組合框會表現不同? <組合框IsEditable = 「真」 文本= 「{結合時間,模式=雙向,轉換器= {的StaticResource MyConverter},UpdateSourceTrigger =的PropertyChanged}」/> – sturdytree 2012-02-25 09:15:06