CommunityToolkit.Mvvm과 MvvmDialogs nuget패키지를 사용해 다이얼로그를 표시하는 방법을 정리해 놓는다.
- CommunityToolkit1.zip : 파라미터가 없는 View생성자 예제
- CommunityToolkit1_1.zip : 파라미터가 있는 View생성자 예제
실행화면

1. 프로젝트 만들기
- Visual Studio 2022 Version 17.11.4
- Target framework : .NET 8.0
2. 필요한 nuget패키지
CommunityToolkit.Mvvm
Microsoft.Extensions.DependencyInjection
Microsoft.Xaml.Behaviors.Wpf
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.FileExtensions
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Logging
MvvmDialogs
Serilog
Serilog.Enrichers.CallerInfo
Serilog.Enrichers.Environment
Serilog.Enrichers.Thread
Serilog.Extensions.Logging
Serilog.Settings.Configuration
Serilog.Sinks.Console
Serilog.Sinks.File
Serilog.Sinks.Seq
(빨간색이 주요 패키지)
3. View(xaml파일)에 추가할 내용
- CommunityToolkit1.zip

DialogServiceViews.IsRegistered="True" : ViewModel타입에 맞는 View를 찾을 수 있게 View를 등록하는 용도
예) DialogEx1.ViewModels.OptionsWindowViewModel에 해당하는 다이얼로그 생성시 DialogEx1.Views.OptionsWindow타입의 다이얼로그 생성
4. ViewModel에서 사용방법
예) MainWindow에서 OptionsWindow를 모달다이얼로그로 표시(MainWindowViewModel.cs)

IDialogService.ShowDialog호출시 전달된 ViewModel에 맞는 View가 등록되어 있으면 해당 View를 찾아서 다이얼로그를 생성해 준다.
5. View의 생성자(xaml.cs파일)에 파라미터가 있는 경우 추가할 내용
- CommunityToolkit1_1.zip
5.1 OptionsWindow의 생성자에 인자가 있는 경우 발생하는 예외
- OptionsWindow의 파라미터가 있는 생성자(OptionsWindowViewModel.cs)
public OptionsWindow(Ilogger logger)
{
_logger = logger;
InitializeComponent();
}
- 다이얼로그 생성시 예외 발생(MainWindowViewModel.cs)

System.MissingMethodException: 'Cannot dynamically create an instance of type 'DialogEx1.Views.OptionsWindow'. Reason: No parameterless constructor defined.’
- MvvmDialogs의 IDialogFactory 기본 구현체가 파라미터가 없는 생성자만 처리할 수 있다
(public OptionsWindow(Ilogger logger)생성자를 처리할 수 없기 때문에 발생하는 에러)
5.2 파라미터가 있는 생성자 처리방법
- MvvmDialogs의 IDialogFactory 기본 구현체대신 커스텀 구현체를 만든다(DialogEx1DialogFactory.cs)
public class DialogEx1DialogFactory : IDialogFactory
{
public IWindow Create(Type dialogType)
{
if (dialogType == null) throw new ArgumentNullException(nameof(dialogType));
// CommunityToolkit의 Ioc.Default.GetService() 메서드를 사용하여 dialogType의 인스턴스를 가져옴
// App클래스(App.xaml.cs)에서 ConfigureServices() 메서드를 사용하여 서비스를 구성하고
// Ioc.Default.ConfigureServices() 메서드를 사용하여 서비스를 구성함
var instance = Ioc.Default.GetService(dialogType);
if (instance == null)
{
// 파라미터가 없는 기본 생성자로 인스턴스 생성(MvvmDialogs의 기본 동작)
instance = Activator.CreateInstance(dialogType);
if (instance == null)
{
throw new InvalidOperationException($"Failed to create an instance of {dialogType}.");
}
}
return instance switch
{
IWindow customDialog => customDialog,
Window dialog => new WindowWrapper(dialog),
_ => throw new ArgumentException($"Only dialogs of type {typeof(Window)} or {typeof(IWindow)} are supported.")
};
}
}
- MvvmDialogs.DialogService에 커스텀 IDialogFactory를 사용한다(App.xaml.cs)
:
var dialogService = new DialogService(dialogFactory: new DialogEx1DialogFactory());
services.AddSingleton<IDialogService>(dialogService);
:
참고자료
로그설정 설명
- https://programmer-jeong.tistory.com/27
'programming > C#' 카테고리의 다른 글
MVVM방식으로 여러 View간 전환하기 (1) | 2024.10.19 |
---|---|
Json, Xml, Ini설정파일 읽기/쓰기 (1) | 2024.10.19 |