WPF 데이터바인딩, 멀티바인딩(MultiBinding) 개요 및 실습, WPF학원, WPF교육
http://ojc.asia/bbs/board.php?bo_table=WPF&wr_id=179
ojc.asia
https://www.youtube.com/watch?v=A0atwgTrcjY&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=11&t=1s

https://www.youtube.com/watch?v=8EA-LXKJpkI&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=12

- 여러 속성을 단일 컨트롤에 바인딩하는 것을 멀티바인딩(MultiBinding) 이라고 한다.
- MultiBinding에는 항상 MultiValueConverter를 동반하는데 그 안에 컨트롤에 전달할 값을 결정하는 로직을 정의하면 된다.
- 사원들의 목록을 리스트박스, TextBlock, TextBox에 멀티바인딩 하고 TextBox에서 수정을 하면 사원 데이터가 수정되어 리스트박스 및 TextBlock에 역바인딩 되는 것을 확인하는 예제를 작성하자.
- 실행화면
최초 실행시 EmpConverter의 Convert() 메소드가 호출되어 Emp 컬렉션의 데이터가 ”:”를 기준으로 결합되어 리스트박스 및 TextBlock, TextBox에 로딩된다. SMITH 사원의 직무는 Salesman 인데 이를 선택 후 맨 하단의 TextBox에서 “이종철 : Manager”로 수정을 하면 TextBox가 포커스를 잃을 때 EmpConverter의 ConvertBack() 메소드가 호출되어 Emp 컬렉션이 수정되고 이것이 다시 리스트박스 및 TextBlock 2군데에 재 바인딩 되는 것을 확인하자.



- 프로젝트명 : MultiBinding
- 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>
- 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; }
}
}
- 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;
}
}
}
#멀티바인딩, #멀티데이터바인딩, #WPF데이터바인딩, #WPF교육, #WPF강좌, #WPF학원, #DataBinding, #WPFDataBinding
멀티바인딩, 멀티데이터바인딩, WPF데이터바인딩, WPF교육, WPF강좌, WPF학원, DataBinding, WPFDataBinding