KeiStory

WPF MultiBinding 사용하기

 

 

Command 에 인자로 두가지 항목을 던지고자 할 때

이를 class 로 정의하여 CommandParameter 로 던질수 있습니다.

 

먼저 프로젝트에 Prism.Wpf Nuget Package 를 설치합니다.

 

이제 Class 를 정의합니다.

(string, object 로 구성)

[StringObject.cs]

namespace MultiValueConverterSample
{
    public class StringObject
    {
        /// <summary>
        /// 문자열 데이터입니다.
        /// </summary>
        public string StringData;
 
        /// <summary>
        /// 오브젝트 데이터입니다.
        /// </summary>
        public object ObjectData;
 
        /// <summary>
        /// 생성자입니다.
        /// </summary>
        /// <param name="stringData">문자열 데이터입니다.</param>
        /// <param name="objectData">오브젝트 데이터입니다.</param>
        public StringObject(string stringData, object objectData)
        {
            this.StringData = stringData;
            this.ObjectData = objectData;
        }
    }
}

 

IMultiValueConverter 를 정의합니다.

(화면에서 처리된 두개의 인자를 가지고 위에서 만들 Class 구조로 변환해 리턴)

[StringObjectConverter.cs]

using System;
using System.Globalization;
using System.Windows.Data;
 
namespace MultiValueConverterSample
{
    public class StringObjectConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            return new StringObject(values[0].ToString(), values[1]);
        }
 
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

 

화면은 아래 처럼 구성합니다.

(조회 버튼을 클릭하면 StringObjectCommand 를 실행해

입력한 값을 string 으로 버튼 객체를 object 로 하여 CommandParameter 로 사용)

[MainWindow.xaml]

<Window x:Class="MultiValueConverterSample.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"
        xmlns:local="clr-namespace:MultiValueConverterSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:StringObjectConverter x:Key="StringObjectConverter" />
    </Window.Resources>
    <Grid>
        <StackPanel>
            <TextBox Name="contentTextBlock" Width="100" Height="30" Margin="10"/>
            <Button Name="searchButton" Content="조회" Margin="10" Height="30" Width="100" Command="{Binding StringObjectCommand}">
                <Button.CommandParameter>
                    <MultiBinding Converter="{StaticResource StringObjectConverter}">
                        <Binding ElementName="contentTextBlock" Path="Text" />
                        <Binding ElementName="searchButton" />
                    </MultiBinding>
                </Button.CommandParameter>
            </Button>
        </StackPanel>
    </Grid>
</Window>

 

코드비하인드 에서는 아래처럼 처리합니다.

(반드시 this.DataContext = this; 을 해야 Command 가 처리ㅌ됨)

[MainWindow.xaml.cs]

using Prism.Commands;
 
using System.Windows;
using System.Windows.Input;
 
namespace MultiValueConverterSample
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        #region StringObjectCommand
 
        /// <summary>
        /// StringObjectCommand
        /// </summary>
        public ICommand StringObjectCommand
        {
            get
            {
                if (stringObjectCommand == null)
                {
                    stringObjectCommand = new DelegateCommand<StringObject>((stringObject) =>
                    {
                        string stringData = stringObject.StringData;
                        object objectData = stringObject.ObjectData;
                    });
                }
                return stringObjectCommand;
            }
        }
        private DelegateCommand<StringObject> stringObjectCommand;
 
        #endregion
 
        public MainWindow()
        {
            InitializeComponent();
 
            this.DataContext = this;
        }
    }
}

 

조회 버튼을 누르게 되면 Command 에서 아래 처럼 해당 항목이 넘어온것을 확인할 수 있습니다.

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band