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 에서 아래 처럼 해당 항목이 넘어온것을 확인할 수 있습니다.
WPF TextBox 에 PlaceHolder 설정하기 (0) | 2024.07.25 |
---|---|
WPF DataContext 의 특정 Command 를 찾아 실행하기 (0) | 2024.07.25 |
WPF RelativeSource 간단 설명 (0) | 2024.07.25 |
WPF DrawingBrush 사용하여 화면에 도형 그리기 (0) | 2024.07.25 |
WPF 마우스 드래그로 길이 표시하는 사각형 그리기 (0) | 2024.07.25 |