天天看點

WPF UpdateSourceTrigger屬性

原文: WPF UpdateSourceTrigger屬性

TextBox中的變化并不是立即傳遞到源,而是在TextBox失去焦點後,源才更新。這種表現由綁定中的UpdateSourceTrigger屬性來控制。它的預設值是Default,源會根據你綁定的屬性來更新。寫這篇文章的時候,除了Text屬性之外的所有屬性,源會随屬性的改變而立即更新。Text屬性不一樣,它隻有在目标元素失焦後才更新。

UpdateSourceTrigger的預設值是Default,其他值有PropertyChanged、LostFocus和Explicit。前兩個已經描述過了,最後一個是指必須通過手動推送來更新,通過調用UpdateSource。

下面來看看上面這些選項是如何工作的,下面的例子由上一章的例子更新而來:

<Window x:Class="WpfTutorialSamples.DataBinding.DataContextSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataContextSample" Height="130" Width="310">
        <StackPanel Margin="15">
                <WrapPanel>
                        <TextBlock Text="Window title:  " />
                        <TextBox Name="txtWindowTitle" Text="{Binding Title, UpdateSourceTrigger=Explicit}" Width="150" />
                        <Button Name="btnUpdateSource" Click="btnUpdateSource_Click" Margin="5,0" Padding="5,0">*</Button>
                </WrapPanel>
                <WrapPanel Margin="0,10,0,0">
                        <TextBlock Text="Window dimensions: " />
                        <TextBox Text="{Binding Width, UpdateSourceTrigger=LostFocus}" Width="50" />
                        <TextBlock Text=" x " />
                        <TextBox Text="{Binding Height, UpdateSourceTrigger=PropertyChanged}" Width="50" />
                </WrapPanel>
        </StackPanel>
</Window>
      
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace WpfTutorialSamples.DataBinding
{
        public partial class DataContextSample : Window
        {
                public DataContextSample()
                {
                        InitializeComponent();
                        this.DataContext = this;
                }

                private void btnUpdateSource_Click(object sender, RoutedEventArgs e)
                {
                        BindingExpression binding = txtWindowTitle.GetBindingExpression(TextBox.TextProperty);
                        binding.UpdateSource();
                }
        }
}
      

  

WPF UpdateSourceTrigger屬性

面三個文本框分别使用了不同的UpdateSourceTrigger。

第一個使用的是Explicit,源不會更新除非你手動來操作。正因為這個原因,我在這個TextBox旁邊添加了一個按鈕,用于手動更新源。在背景代碼中,我們看到點選事件處理方法裡面隻有兩行代碼,第一行擷取目标控件的綁定,第二行調用UpdateSource()方法。

第二個使用的是LostFocus,對于Text綁定來說其實就是一個預設值。也就是說一旦目标控件失去焦點,源就會被更新。

第三個使用的是PropertyChanged,一旦綁定的屬性值改變,源會立即更新。本例中文本改變就産生這種效果。

綁定的UpdateSourceTrigger屬性用來控制改變的值何時傳遞給源。WPF很容易控制這些,一般情況下預設值足以應付大多數例子。你可以同時獲得持續更新的UI和良好的性能。

在其他情況下,你需要使用更多的程序控制,這個屬性将非常有用。記住很多你不更新源的地方,往往是需要被更新的。如果你想完全獲得掌控權,那麼使用Explicit,然後手動更新,但是這個超出了資料綁定這一塊的内容。