[WPF] UpdateSourceTrigger

C#/WPF 2020. 9. 7. 18:22
728x90
728x170

UpdateSourceTrigger 속성은 바인딩 소스 업데이트 타이밍을 결정하는 값을 가져오거나 설정할때 사용되는 속성입니다.

 

Default

Text속성의 기본값은 LostFocus이지만, 대부분의 종속성 속성의 기본값은 PropertyChanged입니다.

 

PropertyChanged

바인딩 대상 속성이 변경될 때마다 바인딩 소스를 즉시 업데이트합니다.

 

LostFocus

바인딩 대상 요소가 포커스를 잃을 때마다 바인딩 소스를 업데이트합니다.

 

Explicit

UpdateSource 메서드를 호출할 때만 바인딩 소스를 업데이트합니다.


예)

 BindingExpression bindingExpression = textBox.GetBindingExpression(TextBox.TextProperty);

 bindingExpression.UpdateSource();


 

 

* 간단히 말하면 커서가 벗어난 경우(LostFocus) 속성변경 처리를 할것이냐 아니면 실시간으로(PropertyChanged) 반영할것이냐라고 보면 될것같습니다.

 

아래는 간단한 예시입니다.

 

MainWindow.xaml

<Window x:Class="UpdateSourceTriggerTest.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        mc:Ignorable="d"

        Title="MainWindow" Height="190" Width="394.666">

    <Grid>

        <StackPanel>

            <Label Content="UpdateSourceTrigger=PropertyChanged"/>

            <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>

            

            <Rectangle StrokeThickness="1" Fill="#465168" Height="1" />

            <Label Content=" UpdateSourceTrigger=Default"/>

            <TextBox Text="{Binding Name, UpdateSourceTrigger=Default}"/>

 

            <Rectangle StrokeThickness="1" Fill="#465168" Height="1" />

            <Label Content=" Value"/>

            <Label Content="{Binding Name}"/>

        </StackPanel>

    </Grid>

</Window>

 

 

MainWindow.xaml.cs

using System.Windows;

 

namespace UpdateSourceTriggerTest

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            this.DataContext = new TestData() { Name = "TEST", Order = 1 };

        }

 

        public class TestData

        {

            public string Name { get; set; }

            public int Order { get; set; }

        }

    }

}

 

 


 

예시를 보면

PropertyChanged 인 경우는 실시간으로 변경사항이 반영되지만

Default 인 경우는 커서를 벗어난 경우 변경사항이 반영됩니다.

상황에 따라 맞는걸 쓰면 되겠습니다.

 

 

728x90
그리드형
Posted by kjun
,