programming/C#

CommunityToolkit.Mvvm사용시 다이얼로그창 표시방법1

programmer j 2024. 10. 5. 16:34

CommunityToolkit1.zip
0.01MB
CommunityToolkit1_1.zip
0.01MB

 

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.’

- MvvmDialogsIDialogFactory 기본 구현체가 파라미터가 없는 생성자만 처리할 수 있다

  (public OptionsWindow(Ilogger logger)생성자를 처리할 수 없기 때문에 발생하는 에러)

 

5.2 파라미터가 있는 생성자 처리방법

- MvvmDialogsIDialogFactory 기본 구현체대신 커스텀 구현체를 만든다(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