wpf의 MVVM패턴 사용시 commandparameter의 값을 여러개를 받을때 사용 할 수 있는 코드입니다.
-소스는 저번에 사용한 ICommand활성화 비활성화를 가져다 썻습니다.
1.컨버터 코드 생성
//컨버터
class Converter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.Clone();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
2.xaml 파일에서 컨버터를 리소스로 설정해주고 버튼에 멀티 바인딩 컨버터 지정.
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource Converter}">//컨버터 리소스 사용
<Binding ElementName="Main"/> //첫번째 파라미터 Main object
<Binding Path="Height" ElementName="txlast"/>// 두번째 파라미터 텍스트박스 Height값
</MultiBinding>
</Button.CommandParameter>
<Window x:Class="WpfApp2.Window1"
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:WpfApp2"
mc:Ignorable="d"
Title="Window1" Height="450" Width="800"
Name="Main">
<Window.Resources>
<local:Converter x:Key="Converter"/>
</Window.Resources>
<Grid>
<TextBlock Text="{Binding Title}" HorizontalAlignment="Left" Margin="148 58 0 0" TextWrapping="Wrap" VerticalAlignment="Top" Height="20"></TextBlock>
<TextBlock Text="{Binding Num}" HorizontalAlignment="Left" Margin="148 103 0 0" TextWrapping="Wrap" VerticalAlignment="Top"></TextBlock>
<TextBox Text="{Binding Path=Num, Mode=TwoWay}" HorizontalAlignment="Left" Margin="364 58 0 0" TextWrapping="Wrap" VerticalAlignment="Top" Height="23" Width="120"></TextBox>
<TextBox Name="txlast" Text="참조" HorizontalAlignment="Left" Margin="364 103 0 0" TextWrapping="Wrap" VerticalAlignment="Top" Height="23" Width="120"></TextBox>
<Button Command="{Binding CheckCommand}" Content="Button" HorizontalAlignment="Left" Margin="364,151,0,0" VerticalAlignment="Top" Width="75">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource Converter}">
<Binding ElementName="Main"/>
<Binding Path="Height" ElementName="txlast"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
</Grid>
</Window>
3. execute에 (object[])캐스팅을 통해 넘겨받은 파라미터를 확인해 봅니다.
public void Execute(object o)
{
var value = (object[])o;
var value1 = value[0];
var value2 = value[1];
this.execute();
}
디버깅
디버깅을 해보면 xaml에서 넘긴 첫번째 파라미터 object Window1이 넘어왔으며
두번째 파라미터로는 txtblock의 Height의 값이 넘어 왔습니다.
'c#' 카테고리의 다른 글
c# image to byte 이미지 바이트로 전환, 이미지 압축 하는 법 (0) | 2023.02.27 |
---|---|
c# 보조 키 이벤트 , 컨트롤 키 추가 이벤트 넣는 법 (0) | 2023.02.20 |
wpf MVVM ICommand 버튼 비활성화 활성화 (0) | 2023.01.26 |
C# 오류 'System.Windows.ResourceDictionary' 형식의 개체를 만들 수 없습니다. 원인 분석 (0) | 2023.01.18 |
WPF 디자인 패턴 mvvm패턴 viewmodel? view? (0) | 2023.01.14 |