WPF, XAML

C#, WPF 데이터 바인딩, 멀티바인딩(MultiBinding) 개요 및 실습

FSP 0 89 04.07 13:44

C#, WPF 데이터 바인딩, 멀티바인딩(MultiBinding) 개요 및 실습 

 

 

WPF 데이터 바인딩

멀티바인딩(MultiBinding) 개요 및 실습

 

www.topcredu.co.kr

작성자 : 이종철

 

n  여러 속성을 단일 컨트롤에 바인딩하는 것을 멀티바인딩(MultiBiding) 이라고 한다.

n  MultiBinding에는 항상 MultiValueConverter를 동반하는데 그 안에 컨트롤에 전달할 값을 결정하는 로직을 정의하면 된다.

n  사원들의 목록을 리스트박스, TextBlock, TextBox에 멀티바인딩 하고 TextBox에서 수정을 하면 사원데이터가 수정되어 리스트박스 및 TextBlock에 역바인딩 되는 것을 확인하는 예제를 작성하자.

n  실행화면

최초 실행시 EmpConverterConvert() 메소드가 호출되어 Emp 컬렉션의 데이터가 ”:”를 기준으로 결합되어 리스트박스 및 TextBlock, TextBox에 로딩된다. SMITH  사원의 직무는 Salesman 인데 이를 선택 후 맨 하단의 TextBox에서 이종철 : Manager”로 수정을 하면 TextBox가 포커스를 잃을 때 EmpConverterConvertBack() 메소드가 호출되어 Emp 컬렉션이 수정되고 이것이 다시 리스트박스 및 TextBlock 2군데에 재 바인딩 되는 것을 확인하자.

 

 

 

n  프로젝트명 : MultiBinding

n  MainWindow.xaml

<Window x:Class="MultiBinding.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:MultiBinding"

        mc:Ignorable="d"

        Title="사원 리스트" SizeToContent="WidthAndHeight">

    <Window.Resources>

        <local:Emps x:Key="Emps"/>

        <local:EmpConverter x:Key="EmpConverter"/>

        <DataTemplate x:Key="EmpListTemplate">

            <TextBlock>

                <TextBlock.Text>

                    <MultiBinding Converter="{StaticResource EmpConverter}"

                                  Mode="TwoWay">

                        <Binding Path="Ename"/>

                        <Binding Path="Job"/>

                    </MultiBinding>

                </TextBlock.Text>

            </TextBlock>

        </DataTemplate>

        <Style x:Key="mystyle" TargetType="{x:Type Control}">

            <Setter Property="Width" Value="120"/>

            <Setter Property="Background" Value="Yellow"/>

            <Setter Property="HorizontalAlignment" Value="Center"/>

        </Style>

    </Window.Resources>

    <StackPanel>

        <TextBlock HorizontalAlignment="Center"> 사원 리스트</TextBlock>

        <ListBox Width="100" Style="{StaticResource mystyle}"

                     ItemsSource="{Binding Source={StaticResource Emps}}"

                     ItemTemplate="{StaticResource EmpListTemplate}"

                     IsSynchronizedWithCurrentItem="True"/>

        <TextBlock HorizontalAlignment="Center" Margin="10"> 선택한 사원</TextBlock>

        <TextBlock Name="textBlock1" DataContext="{StaticResource Emps}" HorizontalAlignment="Center">

            <TextBlock.Text>

                <MultiBinding Converter="{StaticResource EmpConverter}"

                                ConverterParameter="reverse">

                    <Binding Path="Ename"/>

                    <Binding Path="Job"/>

                </MultiBinding>

            </TextBlock.Text>

        </TextBlock>

        <TextBlock Name="textBlock2" DataContext="{StaticResource Emps}" HorizontalAlignment="Center">

            <TextBlock.Text>

                <MultiBinding  Converter="{StaticResource EmpConverter}">

                    <Binding Path="Ename"/>

                    <Binding Path="Job"/>

                </MultiBinding>

            </TextBlock.Text>

        </TextBlock>

        <TextBox Name="textBox1" DataContext="{StaticResource Emps}" Style="{StaticResource mystyle}">

            <TextBox.Text>

                <MultiBinding  Converter="{StaticResource EmpConverter}">

                    <Binding Path="Ename"/>

                    <Binding Path="Job"/>

                </MultiBinding>

            </TextBox.Text>

        </TextBox>

    </StackPanel>

</Window>

 

n  Emp.cs

using System.Collections.ObjectModel;

 

namespace MultiBinding

{

    class Emps : ObservableCollection<Emp>

    {

        internal Emps()

        {

            Add(new Emp() { Ename = "SMITH", Job = "Salesman" });

            Add(new Emp() { Ename = "KING", Job = "Manager" });

            Add(new Emp() { Ename = "FORD", Job = "CLERK" });

            Add(new Emp() { Ename = "JOHN", Job = "CLERK" });

        }

    }

    class Emp

    {

        public string Ename { get; set; }

        public string Job { get; set; }

    }

}

 

n  EmpConverter.cs

using System;

using System.Globalization;

using System.Windows.Data;

 

namespace MultiBinding

{

    class EmpConverter : IMultiValueConverter

    {

        public object Convert(object[] val, Type targetType, object param, CultureInfo culture)

        {

            string EmpData;

 

            switch((string)param)

            {

                case "reverse": EmpData = val[1] + " : " + val[0]; break;

                default: EmpData = val[0] + " : " + val[1]; break;

            }

            return EmpData;

        }

 

        public object[] ConvertBack(object val, Type[] targetTypes, object param, CultureInfo culture)

        {

            var splitValues = ((string)val).Split(':');

            return splitValues;

        }

    }

}


 

, , , , , ,

Comments