【桌面開發】WPF中數據綁定作用UpdateSourceTrigger屬性

一、WPF和WinForm

WPF中的數據綁定binding與動態觸發UpdateSourceTrigger是通過屬性來實現,winform中沒有對應的機制,要通過具體的事件來實現,如WPF中textchanged可以在文本發生改變觸發一些屬性變動和數據傳遞,但是winForm只能通過相應的textchanged事件來實現;
如WPF中isMouseOver 可以在鼠標懸浮時修改屬性或傳遞數據,但是winform只能通過MouseEnter MouseMove MouseLeave事件組合來實現。

二、UpdateSourceTrigger屬性

WPF中,TextBox中的變化並不是立即傳遞到源,而是在TextBox失去焦點後,源才更新。這種表現由綁定中的UpdateSourceTrigger屬性來控制。它的默認值是Default,源會根據你綁定的具體的屬性來更新

WPF中,對於TextBox,除了Text屬性之外的所有屬性,源會隨屬性的改變而立即更新;但是Text屬性不一樣,它只有在目標元素失焦後才更新。

UpdateSourceTrigger的默認值是Default,其他值有PropertyChanged、LostFocus和Explicit。

PropertyChanged:屬性改變立即更新
LostFocus:失去焦點才更新
Explicit:手動推送才更新

<Window x:Class="WpfApplication1_UpdateSourceTrigger.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1_UpdateSourceTrigger"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <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 WpfApplication1_UpdateSourceTrigger
{
    /// <summary>
    /// MainWindow.xaml 的交互邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
        }

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

在這裏插入圖片描述

上面三個文本框分別使用了不同的UpdateSourceTrigger。
第一個使用的是Explicit,源不會更新除非你手動來操作。正因爲這個原因,我在這個TextBox旁邊添加了一個按鈕,用於手動更新源。在後臺代碼中,我們看到點擊事件處理方法裏面只有兩行代碼,第一行獲取目標控件的綁定,第二行調用UpdateSource()方法。

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

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

請嘗試在自己的電腦上運行上面的例子,來觀察這三個文本框有哪些區別:第一個文本框的值在你點擊按鈕之前不會改變,第二個在你離開這個文本框時才改變,第三個敲下鍵盤就會自動更新。

三、小結

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

資源地址:https://download.csdn.net/download/qq_36963950/12450479

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章