티스토리 뷰
다음 카페에 질문 올려주신 내용에 대해서 간단한 소스를 만들었습니다.
닷넷 (.NET) 프로그래머 모임 | MVVM과 combobox에 대한 질문드립니다. - Daum 카페
1. NuGet Packages
Microsoft.Toolkit.Mvvm
Microsoft.Xaml.Behaviors.Wpf
2. View (XAML)
<Window
x:Class="WpfCombo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfCombo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock FontSize="30" Text="ComboBox Sample" />
<ComboBox ItemsSource="{Binding EnumStrings}">
<b:Interaction.Triggers>
<b:EventTrigger EventName="SelectionChanged">
<b:InvokeCommandAction Command="{Binding SelectionChangedCommand}" PassEventArgsToCommand="True" />
</b:EventTrigger>
</b:Interaction.Triggers>
</ComboBox>
</StackPanel>
</Grid>
</Window>
- Window.DataContext : 뷰모델을 뷰와 연결 시키고 있습니다.
- xmlns:b="http://schemas.microsoft.com/xaml/behaviors" : Behavior를 사용하기 위한 네임 스페이스 입니다.
- ComboBox는 Command 프로퍼티를 가지고 있지 않습니다. 그래서 ComboBox에서 발생하는 이벤트와 Command를 연결하기 위해서는 EventTrigger를 사용하고 InvokeCommandAction을 이용해 주어야합니다. 이러한 이련의 과정에는 꼭 Behavior nuget package가 필요 합니다.
- 위의 예제에서 SelectionChanged 이벤트를 SelectionChangedCommand와 연결을 했습니다.
- PassEventArgsToCommand="True" 이 코드는 이벤트가 발생할때 함께 전달되는 이벤트 Args를 CommandParameter에 넣어서 뷰모델에 전달할지 여부를 지정하게 됩니다.
3. ViewModel (c#)
using Microsoft.Toolkit.Mvvm.ComponentModel;
using Microsoft.Toolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace WpfCombo
{
public class MainWindowViewModel : ObservableObject
{
private IList<string> _enumStrings = new List<string>();
public IList<string> EnumStrings
{
get => _enumStrings;
set => SetProperty(ref _enumStrings, value);
}
public ICommand SelectionChangedCommand { get; set; }
public MainWindowViewModel()
{
foreach (object item in Enum.GetValues(typeof(TestEnum)))
{
EnumStrings.Add(item.ToString());
}
SelectionChangedCommand = new RelayCommand<object>(OnSelectionChanged);
}
private void OnSelectionChanged(object obj)
{
SelectionChangedEventArgs args = obj as SelectionChangedEventArgs;
if (args == null)
{
return;
}
object selectedItem = args.AddedItems[0];
MessageBox.Show($"You selected is {selectedItem}");
}
}
}
- Microsoft mvvm nuget pacakge는 ObservableObject를 상속받아야 프로퍼티 체인지 이벤트를 발생시킬 수 있습니다.
- Microsoft mvvm nuget pacakge에서는 RelayCommand를 이용합니다.
- SelectionChangedCommand를 RelayCommand로 초기화 합니다. 그런데, 뷰에서 CommandParameter를 이용하는 경우에는 입력되는 값의 type을 지정해서 생성합니다. 여기서는 object type이 입력된다고 설정했습니다.
- OnSelectionChanged는 실제 커맨드가 실행하는 메소드 입니다.
- 전달받은 obj의 형변환을 하고 args.AddedItems[0]을 이용해서 선택된 아이템을 반환합니다.
- MessageBox.Show를 호출해서 출력합니다.
4. 소스
'WPF .NET' 카테고리의 다른 글
2022 - SQLite Sample (0) | 2022.01.13 |
---|---|
.Net Core Wpf 프로젝트 ClickOnce로 배포하기 (0) | 2021.09.13 |
Localization in WPF (5) | 2021.03.22 |
Button Left Click시 ContextMenu 열기 (0) | 2021.03.10 |
Visual Studio를 이용한 Memory Leak 확인 방법 (3) | 2021.03.08 |
- Total
- Today
- Yesterday
- UWP
- Cross-platform
- #MVVM
- Build 2016
- XAML
- Windows 10
- windows 11
- ComboBox
- #Windows Template Studio
- PRISM
- LINQ
- kiosk
- ef core
- .net
- visual studio 2019
- Behavior
- C#
- Always Encrypted
- Bot Framework
- dotNETconf
- .net 5.0
- WPF
- Visual Studio 2022
- MVVM
- IOT
- Microsoft
- #prism
- uno platform
- #uwp
- uno-platform
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |