참고 https://prismlibrary.com/docs/wpf/getting-started.html

순서

I. Prism 이란
II. App에 Prism 추가하기
III. MainWindow - Prism 연결하기
<Class Override>

1. RegisterTypes
2. CreateShell 
IV. MVVM 패턴 (Binding) 사용하기
V. View - ViewModel 연결하기

VI. 기타

1. Visual Studio에 설치하기
2. View - View Model 연동원리

 


 

I. Prism 이란

Prism은 WPF (Window Presentation Foundation) 이라는
C#기반의 Window UI 개발을 위해 제공되는 라이브러리로
Model-View-Viewmodel (MVVM) 패턴을 편리하게 사용 할 수 있도록 만들어준다.


II. App에 Prism 추가하기

처음 .NET 프로젝트를 시작하면 아래와 같이 4개가 나타난다.

App. xaml - App.xaml.cs
MainWindow.xaml - MainWindow.xaml.cs
 

MainWindow는 UI관련한 파일들이고
App은 이 어플리케이션 작동에 관련된 파일이다.

App.xaml 과 App.xaml.cs
MainWindow.xaml과 MainWindow.xaml.cs

 

1. Application에 Object 상속받기

App.xaml에 정의된 Application은 Window 기본 System.Application이다.
우리는 이 기본 Link를 없애고 Prism과 연동시킬 것이다.

App.xaml

// prism:PrismApplication으로 정의해준다.
<prism:PrismApplication x:Class="WPF_TestProj.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPF_TestProj"
             StartupUri="MainWindow.xaml">

    <Application.Resources>
         
    </Application.Resources>
</prism:PrismApplication>

 

2.xmls에 Prism 추가

App.xaml

// prism:PrismApplication으로 정의해준다.
<prism:PrismApplication x:Class="WPF_TestProj.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPF_TestProj"
             StartupUri="MainWindow.xaml"
             xmlns:prism ="http://prismlibrary.com/"> <-- 이부분임

    <Application.Resources>
         
    </Application.Resources>
</prism:PrismApplication>

 

3.startupUri지우기

<prism:PrismApplication x:Class="WPF_TestProj.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPF_TestProj"
삭제 <--
             xmlns:prism ="http://prismlibrary.com/">

    <Application.Resources>
         
    </Application.Resources>
</prism:PrismApplication>

이로써 우리는 시작 Application을
Window.Application이 아닌 prism:PrismApplication으로 적용하였다.

 


III. MainWindow - Prism 연결하기

실제로 MainWindow - Prism을 상속관계로 Window를 연결하려면
"App.xaml.cs"에서 상속받아 함수들을 Override 시켜준다.

 

1. Class 상속받기 (PrismApplication)

App.xaml.cs

기존코드

using System;
using System.Windows;

namespace WPF_TestProj {
    public partial class App : Application {
    }
}
=============================================
변경된 코드

using System;
using System.Windows;

namespace WPF_TestProj {
    public partial class App : PrismApplication {
    }
}

 

2. 필수 Override1 - CreateShell()

using System.Windows;
using Prism.Ioc;

namespace WPF_TestProj {
    public partial class App{
        // CreateShell 구현
        protected override Window CreateShell() {
            return Container.Resolve<MainWindow>();
        }
    }    
}

 

3. 필수 Override2 - RegisterTypes()

using System.Windows;
using Prism.Ioc;

namespace WPF_TestProj {
  public partial class App{
    // CreateShell 구현
    protected override Window CreateShell() {
      return Container.Resolve<MainWindow>();
    }
    // RegisterTypes구현
    protected override void RegisterTypes(IContainerRegistry containerRegistry) {
    }    
}}

Dependancy Injection 패턴 구현을 위해 필요한 서비스(함수)들을
해당 인터페이스 모음에 등록하는데 Prism은
IContainerProvider Prism.PrismApplicationBase.Container에 가지고 있다.

IContainerRegistry.Register( ) 로 사용자가 직접 만든 interface 를 등록하면
IContainerProvider.Resolve<>() 를 통해 객체를 주입받을 수 있다.

여기까지 진행하면 실행 시 빈 MainWindow 창이 나타난다.

 


IV. MVVM 패턴 (Binding) 사용하기

 

1. MainWindow.xaml에서 Binding 구현하기

Reactive X 방식으로 구현하기 위해 모든 Command 들은 Binding되어 호출된다.
일반적으로 MainWindow에서 Event로 delegate Call 방식과 유사하다.

만약 push 버튼이 있고, 이 동작을 정의하려면 MainWindow.xaml에서 다음과 같이 사용한다.

MainWindow.xaml

<Window x:Class="WPF_TestProj.MainWindow"
        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:WPF_TestProj"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DockPanel>
            <Menu DockPanel.Dock="Top">
                <MenuItem Header= "PrintMenu!">
                    <MenuItem Header="PrintName" Command="{Binding PrintNameCommand}">
                        
                    </MenuItem>
                </MenuItem>
            </Menu>
        </DockPanel>
    </Grid>
</Window>

DockPanel : 내부 요소들 정렬용
Menu : 메뉴창 (일반적으로 파일, 열기, 편집 같은 것들)
MenuItem : 메뉴창에 넣을 항목

 

 위와같이 구현하면 아래와 같이 나타난다.

 

이 때 PrintName을 눌렀을 때 어떤 동작을 수행할 것이냐? 를
코드 해당 부분에서 PrintNameCommand 함수와 Binding해준다.

<MenuItem Header="PrintName" Command="{Binding PrintNameCommand}">          
</MenuItem>

 

 

2. Command를 위한 ViewModel Class 생성하기

MVVM 패턴에서 Model과 View Model이 연동되는데
이때 ViewModel에서 Command 구현이 이루어진다.
ViewModel의 연동을 위해서
새로운 클래스 파일을 만들어야한다.

1. 해당 ViewModel을 만들어주고 BindableBase를 상속받는다.
2. Command 이름을 property로 하여 DelegateCommand로 이벤트 정의해주고
3. 등록한 Command(processPrintNameCommand)를 구현한다.
-> Prism DelegateCommand 참고

 

 


VI. 기타

 

1. Visual Studio에 설치하기

원래는 VS 도구 - 도구 및 기능 가져오기에 있었는데 버전이 올라가면서 지원이 안되고

NuGet을 사용한다.

Easy

 

 

2. Model - View Model 연동 원리

기본적으로 Prism에는 ViewModelLocator에 DataContext가 있어
규칙을 확인한다.
기본규칙
1. Views 폴더를 구성하여 MainWindow관련 파일을 넣을 것.
2. ViewModels 폴더를 구성하여 ViewModel 파일을 넣을 것. 

  • WpfApp1.Views.MainWindow=>WpfApp1.ViewModels.MainWindowViewModel
  • WpfApp1.Views.OtherView=>WpfApp1.ViewModels.OtherViewModel

 

자동으로 연결되는 것이 싫다면
MainWindow.xaml에 다음 코드를 추가한다.

prism : ViewModelLocator.AutoWireViewModel = "False"

 

 

+ Recent posts