티스토리 뷰

반응형

2022.12.06 - [WPF .NET] - Prism Library를 사용하는 개발자를 위한 안내 Part7 - Create RegionAdapter

2022.11.30 - [WPF .NET] - Prism Library를 사용하는 개발자를 위한 안내 Part6 - TabControl Region Navigation

2022.11.25 - [WPF .NET] - Prism Library를 사용하는 개발자를 위한 안내 Part5 - Region & ContentControl Region Navigation

2022.11.18 - [WPF .NET] - Prism Library를 사용하는 개발자를 위한 안내 Part4 - Register Types

2022.11.15 - [WPF .NET] - Prism Library를 사용하는 개발자를 위한 안내 Part3 - DelegateCommand

2022.10.28 - [WPF .NET] - Prism Library를 사용하는 개발자를 위한 안내 Part2 - 프로젝트 구성 살펴 보기

2022.10.27 - [WPF .NET] - Prism Library를 사용하는 개발자를 위한 안내 Part1

Prism의 Region에 대한 설명이 끝났으니, Login 페이지에서 Home으로 이동하면서, 로그인 사용자 정보를 유지하는 예제를 만들어 보았습니다.

1. 전체 구성

MainWindow에는 ContentRegion이 하나 있습니다.

Region이 화면에 출력될 때 보여줄 기본화면이 있는 경우 RegisterViewRegion으로 등록을 해줄 수 있습니다.

Login View에서는 아이디와 이름을 입력 받고, Login 버튼을 누르면 RequestNavigate를 이용해서 Home View로 이동 시킵니다.

2. AppContext

애플리케이션 전체에서 항상 값이 유지되어야 하는 데이터들을 관리하는 클래스를 AppContext라고 했습니다.

AppContext는 아이디, 이름, 접속시간, 접속 아이디 4개의 정보를 계속 보관하도록 구성했습니다.

가능하면 이런 종류의 클래스는 인터페이스를 만들어서 사용하는 것을 추천합니다.

AppContext.cs

/// <summary>
/// 애플리케이션 전체에서 유지되어야하는 데이터 - 싱글톤으로 유지
/// </summary>
public class AppContext : IAppContext
{
    /// <summary>
    /// 로그인 유저 아이디
    /// </summary>
    public string Id { get; set; }
    /// <summary>
    /// 로그인 유저 이름
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 접속시간
    /// </summary>
    public DateTime Connection { get; set; }
    /// <summary>
    /// 접속아이디
    /// </summary>
    public Guid ConnectionId { get; set; } = Guid.NewGuid();
}

이 클래스는 1개의 인스턴스만 유지 되어야 하기 때문에, RegisterSingleton을 이용해서 등록합니다.

App.xaml.cs

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    //AppContext 싱글톤으로 등록
    containerRegistry.RegisterSingleton<IAppContext, AppContext>();

    //Region Navigation할 화면 등록
    containerRegistry.RegisterForNavigation(typeof(Login),nameof(Login));
    containerRegistry.RegisterForNavigation(typeof(Home), nameof(Home));
}

이 클래스를 처음 사용하는 곳은 LoginViewModel입니다.

LoginViewModel.cs

  • LoginViewModel이 생성될 때 IAppContext를 사용하는 인스턴스를 주입받게 됩니다.
  • Container에 인스턴스가 존재 하지 않았다면, 생성 후 주입되고, 이미 존재한다면, 그 녀석이 주입됩니다.
  • IContainerProvider는 나중에 사용할 수 있기 때문에 주입 받았습니다.
  • IRegionManager는 RequstNavigate를 사용하기 위해 주입 받았습니다.
  • Login 버튼을 클릭하면, AppContext.Id와 AppContext.Name이 빈값인지 아닌지 확인 하고, 빈값이 아니면, AppContext.Connection에 현재 시간을 입력한 후 Home뷰로 네비게이션 시켜 줍니다.
private IAppContext _appContext;
/// <summary>
/// AppContext, Id와 Name을 컨트롤에서 직접 입력을 받기 위해서 Public으로 만듬
/// </summary>
public IAppContext AppContext
{
    get => _appContext;
    set => SetProperty(ref _appContext, value);
}

/// <summary>
/// 런타임 생성자
/// </summary>
public LoginViewModel(IContainerProvider containerProvider, IRegionManager regionManager,
    IAppContext appContext)
{
    _containerProvider = containerProvider;
    _regionManager = regionManager;
    AppContext = appContext;

    Init();
}

/// <summary>
/// LoginCommand 처리
/// </summary>
private void OnLogin()
{
    if (string.IsNullOrEmpty(AppContext.Id) || string.IsNullOrEmpty(AppContext.Name))
    {
        _ = MessageBox.Show("Please enter your ID and name.");
        return;
    }
    AppContext.Connection = DateTime.Now;
    _regionManager.RequestNavigate("ContentRegion", "Home");
}

HomeViewModel.cs

  • HomeViewModel이 생성될 때 IAppContext 인터페이스를 사용하는 인스턴스를 주입받습니다.
  • LoginViewModel의 appContext와 여기의 appContext는 동일 인스턴스이기 때문에 모든 데이터를 그대로 가지고 있습니다.
private IAppContext _appContext;
/// <summary>
/// AppContext
/// </summary>
public IAppContext AppContext
{
    get { return _appContext; }
    set { SetProperty(ref _appContext, value); }
}

/// <summary>
/// 런타임 생성자
/// </summary>
public HomeViewModel(IContainerProvider containerProvider, IRegionManager regionManager,
    IAppContext appContext)
{
    _containerProvider = containerProvider;
    _regionManager = regionManager;
    AppContext = appContext;
}

3. 실행

 

이번 포스팅은 가벼운 주제로 만들어 보았습니다.

앞으로 이 포스트를 기본으로 여러가지 내용을 추가하면서 다양항 사용법을 설명하도록 하겠습니다.

 

4. 소스

WpfTest/PrismStep7 at master · kaki104/WpfTest (github.com)

 

GitHub - kaki104/WpfTest

Contribute to kaki104/WpfTest development by creating an account on GitHub.

github.com

 

반응형
댓글