WPF 프로그래밍 - 7. WPF Trigger - 데이터 트리거

Soonyoung Kim·2021년 8월 17일
0

WPF 프로그래밍

목록 보기
4/5

7. WPF Trigger - 데이터 트리거

  • WPF Trigger
  • 데이터 트리거(Data Trigger)

데이터 트리거(DataTrigger)

  • DataTrigger 클래스는 이전의 프로퍼티 트리거의 Property를 바인딩으로 대신하는 것을 제외하고는 Trigger와 유사한데 바인딩은 다른 엘리먼트를 참조한다.
  • DataTrigger는 바인딩 되는 값이 특정 값을 가질 때 프로퍼티를 설정할 수 있게 해준다.
  • 요소로 표시하며 트리거는 의존 속성이 아닌 속성에 사용된다.
  • Model View ViewModel(M-V-VM) 디자인 패턴을 사용하여 데이터 바인딩을 사용하는 경우 이상적이다.

실습1

  • CheckBox와 TextBlock 컨트롤을 만드는데 최초 화면을 로드할 때는 TextBlock이 화면에 나타나지만 CheckBox를 클릭하면 사라지는 예제이다. 물론 다시 Checkbox를 클릭하면 보이게 된다.
  • xaml
<Window x:Class="WpfApp3.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:WpfApp3"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style x:Key="MyStyle" TargetType="TextBlock">
            <Setter Property="Visibility" Value="Visible"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=cb1, Path=IsChecked}" Value="True">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>

            </Style.Triggers>
        </Style>
    </Window.Resources>
    <StackPanel>
        <CheckBox Name="cb1" Content="Click Me" FontSize="20"/>
        <TextBlock Text="Hello WPF" FontSize="20" Style="{StaticResource MyStyle}"/>
    </StackPanel>
</Window>

실습2

  • Slider 컨트롤과 ProgressBar 컨트롤을 만들어 Slider 컨트롤을 움직이면 ProgressBar도 같이 움직이도록 하는데 DataTrigger를 이용하여 스크롤바의 끝에 오면 ProgressBar의 전경색(Foreground)를 빨강으로 변경하는 예제이다.
  • xaml
<Window x:Class="WpfApp3.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:WpfApp3"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style TargetType="{x:Type ProgressBar}">
            <Setter Property="Background" Value="Blue"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding TheValue}" Value="20">
                    <Setter Property="Foreground" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Slider x:Name="MySlider" Margin="5" Minimum="10" Maximum="20"
                Value="{Binding TheValue}"/>
        <ProgressBar Grid.Row="1" Minimum="10" Maximum="20" Value="{Binding TheValue}"/>
        <TextBox Grid.Row="2" Text="{Binding TheValue}"/>
    </Grid>
</Window>
  • xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp3
{
    public class DataOjbect
    {
        public int TheValue { get; set; }
    }
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new DataOjbect();
        }
    }
}
profile
Sin prisa, sin pausa.

0개의 댓글