【桌面开发】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

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