본문 바로가기

Programming/Laboratory

WPF, MVVM | Calibrun.Micro와 C#으로 WPF 애플리케이션 만들기 (1)


Calibrun.Micro

 

Caliburn.Micro · 'Xaml made easy' · Caliburn.Micro

A small, yet powerful framework, designed for building applications across all XAML platforms. Its strong support for MV* patterns will enable you to build your solution quickly, without the need to sacrifice code quality or testability. Features Bind view

caliburnmicro.com

 Caliburn.Micro는 XAML을 사용하는 모든 플랫폼에서 MV* 패턴, MVC·MVP·MVVM 등의 모든 디자인 패턴을 지원하는 프레임워크입니다. 상당히 편리해서 중·소규모의 프로젝트에서 유용하게 쓰일 수 있습니다.

 

 예를 들어, XAML에서 버튼을 생성하고 뷰 모델에서 버튼을 클릭했을 때 메시지 박스를 띄우고 싶다면

// XAML
<Button x:Name="btnMsgBox"/>

// ViewModel
public string btnMsgBox() {
	MessageBox.Show("Hello, World!");
}

 이렇게 단 4줄(사실 C# 코드 규칙으로는 5줄입니다)로 구현할 수 있습니다.

 데이터 바인딩을 하기 위해서 x:Name의 값과 프로퍼티의 이름만 같으면 되는 방식입니다. 생각보다 매우 간소화된 방법으로 MVVM 프로젝트를 개발할 수 있습니다. 매력적입니다!

 

 다음은 Caliburn.Micro를 사용하여 기본 프로젝트를 구축하는 방법입니다.

 

프로젝트에 Caliburn.Micro 적용하기


개발 환경 - Visual Studio 2017

 

01. MVVMDemo라는 이름의 WPF 애플리케이션을 생성합니다.

02. '도구 - Nuget 패키지 관리자 - 솔루션용 Nuget 패키지 관리...'로 들어갑니다.

 

03. 찾아보기에서 'Caliburn.Micro'를 검색하고 설치합니다.

 

04. '솔루션 탐색기 - 참조'에 Caliburn.Micro, Caliburn.Micro.Platform, Caliburn.Micro.Platform.Core가 추가되어 있는지 확인합니다.

 

05. MainWindow.xaml을 지우고, App.xaml에 다음과 같이 입력합니다.

// App.xaml
<Application x:Class="MVVMDemo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MVVMDemo">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <local:Bootstrapper x:Key="Bootstrapper" />
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

 StartupUri를 지우고 ResourceDirectory에 <local:Bootstrapper x:Key="Bootstrapper"/>를 적으면 됩니다.

 

 

06. 클래스 'Bootstrapper.cs'를 추가하고 다음과 같이 입력합니다.

// Bootstrapper.cs
using Caliburn.Micro;
using System.Windows;

namespace MVVMDemo
{
    public class Bootstrapper : BootstrapperBase
    {
        public Bootstrapper()
        {
            Initialize();
        }

        protected override void OnStartup(object sender, StartupEventArgs e)
        {
            DisplayRootViewFor<ShellViewModel>();
        }
    }
}

'DisplayRootViewFor'는 루트 ViewModel을 확인하고 View를 찾은 다음, 둘을 알아서 바인딩해줍니다. 또한, 오버라이드 된 OnStartup에서 호출함으로써, 스플래시 스크린이나 로그인 페이지를 구현하기에 적합합니다.

 

07. 이제 루트 ViewModel인 ShellViewModel을 구현하기 전에, 솔루션에 'Models, ViewModels, Views' 파일을 생성합니다. 생성 후의 프로젝트 구조는 다음과 같습니다.

 

08. 'ViewModels' 폴더에 클래스 'ShellViewModel.cs'를 추가하고 다음과 같이 입력합니다.

// ViewModels/ShellViewModel.cs
using Caliburn.Micro;

namespace MVVMDemo.ViewModels
{
    public class ShellViewModel : Screen
    {
    }
}

 

09. 'Views' 폴더에 창 'ShellView.xaml'을 추가합니다. 추가 후의 프로젝트 구조는 다음과 같습니다.

 

10. 'Bootstarpper.cs'에 'using MVVMDemo.ViewModels'를 입력합니다.

// Bootstarpper.cs
using Caliburn.Micro;
using MVVMDemo.ViewModels;
using System.Windows;

namespace MVVMDemo
{
    public class Bootstrapper : BootstrapperBase
    {
        public Bootstrapper()
        {
            Initialize();
        }

        protected override void OnStartup(object sender, StartupEventArgs e)
        {
            DisplayRootViewFor<ShellViewModel>();
        }
    }
}

 

 

 F5를 눌러서 실행시켜 보세요.

 이제, 기본적인 Caliburn.Micro와 C#을 이용한 WPF 애플리케이션 개발 설정이 끝났습니다!


 솔루션 구조를 보면 알 수 있듯이 'ShellView.xaml', 'ShellViewModel.cs'처럼 현재 View와 ViewModel이 분리되어 있는 상태입니다. 하지만 DataContext와 같은 강제적인 데이터 바인딩 없이도 Caliburn.Micro가 알아서 바인딩을 해주기 때문에 View와 ViewModel 간의 의존성 문제가 사라지게 됩니다.

 

 다만, Caliburn.Micro는 사용하기 간편한 대신에 프로젝트의 규모가 커지면 디버깅을 하기가 어려워진다는 단점 또한 가지고 있습니다. 그래도 배우기가 쉬워 UI와 Code-behind와의 분리를 위해 MVVM을 새로 공부하는 사람들에게는 충분히 사용하기 좋은 프레임워크임에는 틀림없습니다.

 

 다음에는 실제로 간단한 프로젝트를 만들면서 Model, Property 그리고 Method와 Event에 대해 알아보겠습니다.