介紹
這篇文章我將介紹在WPF和Silverlight中更新綁定源的概念。正如您所知道的,當我們用TwoWay的模式綁定時,任何在目標控件上發生的變化都會影響綁定源的值。
請注意只是在用TwoWay綁定的時候,而不是默認的綁定模式OneWay或者OneTime。
現在,問題是當更新源數據時,由於目標控件的數據發生的變化。實際上有三個方法可以實現。
- Default: 由不同控件控制. 例如
TextBox
, 當LostFocus
事件觸發時,目標綁定發生變化. PropertyChanged
: 意味着當目標控件值發生變化時,源數據立馬更新.例如,TextBox
是目標綁定,當輸入字符時, 源數據也發生變化. 着就意味着當你輸入字符創的時候,TextBox的數據Text也在改變.- Explicit: 當
UpdateSourceTrigger
設置為Explicit
, 數據源不會自動更新,只有在后代碼里面顯示的觸發。
針對這些方法我寫啦一些代碼幫助你們更好的理解他們.我們首先從 default 開始. 看下面的代碼塊:
1 <Border BorderThickness="2" Margin="0 20 0 0" BorderBrush="Brown" CornerRadius="5"> 2 <StackPanel> 3 <TextBox x:Name="textInput2" Margin="5" /> 4 <TextBox x:Name="txtOutput2" Margin="5" 5 Text="{Binding Text, 6 ElementName=textInput2, 7 UpdateSourceTrigger=Default, 8 Mode=TwoWay}"/> 9 </StackPanel> 10 </Border>
這里有一個Border元素里面有一個StackPanel里面包含兩個TextBox.第二個TextBox的Text屬性綁定啦第一個TextBox的屬性Text.在所有的例子里面實際上還有一些代碼. 這個綁定的Mode
設置為 TwoWay
因為我們想更新源數據無論目標發生變化的時候. 最后, 綁定的屬性UpdateSourceTrigger被設置為
Default
. 這就意味着當第二個TextBox的綁定目標丟失焦點或者觸發LostFocus
事件時,第一個TextBox的屬性Text綁定的源數據會被更新。
第二個例子是設置 UpdateSourceTrigger
為PropertyChanged
.
1 <Border BorderThickness="2" BorderBrush="Brown" CornerRadius="5"> 2 <StackPanel> 3 <TextBox x:Name="textInput1" Margin="5" /> 4 <TextBox x:Name="txtOutput1" Margin="5" 5 Text="{Binding Text, 6 ElementName=textInput1, 7 UpdateSourceTrigger=PropertyChanged, 8 Mode=TwoWay}"/> 9 </StackPanel> 10 </Border>
這個代碼塊和第二個相比唯一不同的是 UpdateSourceTrigger
被設置為 PropertyChanged
. 正如這個名字暗示的, 這就意味着無論何時第二個TextBox的Text屬性發生變化時,第一個TextBox的屬性Text立馬被更新。
最后,我們最后的例子是將屬性 UpdateSourceTrigger
設置為 Explicit
.
1 <Border BorderThickness="2" Margin="0 20 0 0" BorderBrush="Brown" CornerRadius="5"> 2 <StackPanel> 3 <TextBox x:Name="textInput3" Margin="5" /> 4 <TextBox x:Name="txtOutput3" Margin="5" 5 Text="{Binding Text, 6 ElementName=textInput3, 7 UpdateSourceTrigger=Explicit, 8 Mode=TwoWay}"/> 9 <Button Content="Save" Click="Button_Click"/> 10 </StackPanel> 11 </Border>
不同的東西在這段代碼是UpdateSourceTrigger設置為Explicit。正如我們前面所說,這意味着更新過程不會發生,除非你做到明確操作。這個Button
被聲明在第二個TextBox后面負責做明確操作。正如你可能已經注意到,有一個EventHandler對它的點擊事件Click
event,,下面幾行代碼都寫在那EventHandler里。
1 private void Button_Click(object sender, RoutedEventArgs e) 2 { 3 BindingExpression be = txtOutput3.GetBindingExpression(TextBox.TextProperty); 4 be.UpdateSource(); 5 }
BindingExpression類聲明一個實例。在那之后,txtOutput3獲取TextBox.Text
Property的綁定表達式放在那個實例里。最后,UpdateSource方法的是被稱為明確的更新綁定源。
代碼下載地址:http://www.codeproject.com/Articles/507883/UpdateSourceTrigger-Property-in-WPF-Binding