첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

728x90
반응형

TestSolution.zip
다운로드

 

[TestLibrary 프로젝트]

▶ IApplicationCommand.cs

using Prism.Commands;

namespace TestLibrary
{
    /// <summary>
    /// 어플리케이션 명령 인터페이스
    /// </summary>
    public interface IApplicationCommand
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property

        #region 저장 명령 - SaveCommand

        /// <summary>
        /// 저장 명령
        /// </summary>
        CompositeCommand SaveCommand { get; }

        #endregion
    }
}

 

▶ ApplicationCommand.cs

using Prism.Commands;

namespace TestLibrary
{
    /// <summary>
    /// 어플리케이션 명령
    /// </summary>
    public class ApplicationCommand : IApplicationCommand
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 저장 명령
        /// </summary>
        private CompositeCommand saveCommand = new CompositeCommand(true);

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 저장 명령 - SaveCommand

        /// <summary>
        /// 저장 명령
        /// </summary>
        public CompositeCommand SaveCommand
        {
            get
            {
                return this.saveCommand;
            }
        }

        #endregion
    }
}

 

[TestModule 프로젝트]

▶ TabView.xaml

<UserControl x:Class="TestModule.Views.TabView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"             
    prism:ViewModelLocator.AutoWireViewModel="True">
    <StackPanel
        HorizontalAlignment="Center"
        VerticalAlignment="Center">
        <TextBlock
            Margin="5"
            FontSize="18"
            Text="{Binding Title}" />
        <CheckBox
            Margin="5"
            IsChecked="{Binding CanUpdate}"
            Content="Can Execute" />
        <Button
            Margin="5"
            Padding="5"
            Command="{Binding UpdateCommand}"
            Content="Save" />
        <TextBlock
            Margin="5"
            Text="{Binding UpdatedText}" />
    </StackPanel>
</UserControl>

 

▶ TabView.xaml.cs

using System.Windows.Controls;

namespace TestModule.Views
{
    /// <summary>
    /// 탭 뷰
    /// </summary>
    public partial class TabView : UserControl
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - TabView()

        /// <summary>
        /// 생성자
        /// </summary>
        public TabView()
        {
            InitializeComponent();
        }

        #endregion
    }
}

 

▶ TabViewModel.cs

using System;

using Prism;
using Prism.Commands;
using Prism.Mvvm;

using TestLibrary;

namespace TestModule.ViewModels
{
    /// <summary>
    /// 탭 뷰 모델
    /// </summary>
    public class TabViewModel : BindableBase, IActiveAware
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Event
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 활성화 여부 변경시 이벤트 - IsActiveChanged

        /// <summary>
        /// 활성화 여부 변경시 이벤트
        /// </summary>
        public event EventHandler IsActiveChanged;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 어플리케이션 명령
        /// </summary>
        private IApplicationCommand applicationCommand;

        /// <summary>
        /// 제목
        /// </summary>
        private string title;

        /// <summary>
        /// 업데이트 가능 여부
        /// </summary>
        private bool canUpdate = true;

        /// <summary>
        /// 업데이트 텍스트
        /// </summary>
        private string updatedText;

        /// <summary>
        /// 활성화 여부
        /// </summary>
        private bool isActive;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 제목 - Title

        /// <summary>
        /// 제목
        /// </summary>
        public string Title
        {
            get
            {
                return this.title;
            }
            set
            {
                SetProperty(ref this.title, value);
            }
        }

        #endregion
        #region 업데이트 가능 여부 - CanUpdate

        /// <summary>
        /// 업데이트 가능 여부
        /// </summary>
        public bool CanUpdate
        {
            get
            {
                return this.canUpdate;
            }
            set
            {
                SetProperty(ref this.canUpdate, value);
            }
        }

        #endregion
        #region 업데이트 텍스트 - UpdatedText

        /// <summary>
        /// 업데이트 텍스트
        /// </summary>
        public string UpdatedText
        {
            get
            {
                return this.updatedText;
            }
            set
            {
                SetProperty(ref this.updatedText, value);
            }
        }

        #endregion
        #region 업데이트 명령 - UpdateCommand

        /// <summary>
        /// 업데이트 명령
        /// </summary>
        public DelegateCommand UpdateCommand { get; private set; }

        #endregion
        #region 활성화 여부 - IsActive

        /// <summary>
        /// 활성화 여부
        /// </summary>
        public bool IsActive
        {
            get
            {
                return this.isActive;
            }
            set
            {
                this.isActive = value;

                FireIsActiveChangedEvent();
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - TabViewModel(applicationCommand)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="applicationCommand">어플리케이션 명령</param>
        public TabViewModel(IApplicationCommand applicationCommand)
        {
            this.applicationCommand = applicationCommand;

            UpdateCommand = new DelegateCommand(Update).ObservesCanExecute(() => CanUpdate);

            this.applicationCommand.SaveCommand.RegisterCommand(UpdateCommand);
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 업데이트하기 - Update()

        /// <summary>
        /// 업데이트하기
        /// </summary>
        private void Update()
        {
            UpdatedText = $"Updated : {DateTime.Now}";
        }

        #endregion
        #region 활성화 여부 변경시 이벤트 발생시키기 - FireIsActiveChangedEvent()

        /// <summary>
        /// 활성화 여부 변경시 이벤트 발생시키기
        /// </summary>
        private void FireIsActiveChangedEvent()
        {
            UpdateCommand.IsActive = IsActive;

            IsActiveChanged?.Invoke(this, new EventArgs());
        }

        #endregion
    }
}

 

▶ TestModuleModule.cs

using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;

using TestModule.ViewModels;
using TestModule.Views;

namespace TestModule
{
    /// <summary>
    /// 테스트 모듈 모듈
    /// </summary>
    public class TestModuleModule : IModule
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 초기화시 처리하기 - OnInitialized(containerProvider)

        /// <summary>
        /// 초기화시 처리하기
        /// </summary>
        /// <param name="containerProvider">컨테이너 제공자</param>
        public void OnInitialized(IContainerProvider containerProvider)
        {
            IRegionManager regionManager = containerProvider.Resolve<IRegionManager>();

            IRegion region = regionManager.Regions["ContentRegion"];

            TabView tabViewA = containerProvider.Resolve<TabView>();

            SetTitle(tabViewA, "Tab A");

            region.Add(tabViewA);

            TabView tabViewB = containerProvider.Resolve<TabView>();

            SetTitle(tabViewB, "Tab B");

            region.Add(tabViewB);

            TabView tabViewC = containerProvider.Resolve<TabView>();

            SetTitle(tabViewC, "Tab C");

            region.Add(tabViewC);
        }

        #endregion
        #region 타입 등록하기 - RegisterTypes(containerRegistry)

        /// <summary>
        /// 타입 등록하기
        /// </summary>
        /// <param name="containerRegistry">컨테이너 레지스트리 인터페이스</param>
        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 제목 설정하기 - SetTitle(tabView, title)

        /// <summary>
        /// 제목 설정하기
        /// </summary>
        /// <param name="tabView">탭 뷰</param>
        /// <param name="title">제목</param>
        private void SetTitle(TabView tabView, string title)
        {
            (tabView.DataContext as TabViewModel).Title = title;
        }

        #endregion
    }
}

 

[TestProject 프로젝트]

▶ MainWindow.xaml

<Window x:Class="TestProject.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True"
    Width="800"
    Height="600"
    Title="{Binding Title}"
    FontFamily="나눔고딕코딩"
    FontSize="16">
    <Window.Resources>
        <Style TargetType="TabItem">
            <Setter Property="Header" Value="{Binding DataContext.Title}" />
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"   />
        </Grid.RowDefinitions>
        <Button
            Margin="10"
            Padding="5"
            Command="{Binding ApplicationCommand.SaveCommand}"
            Content="Save" />
        <TabControl Grid.Row="1"
            Margin="10"
            prism:RegionManager.RegionName="ContentRegion" />
    </Grid>
</Window>

 

▶ MainWindow.xaml.cs

using System.Windows;

namespace TestProject.Views
{
    /// <summary>
    /// 메인 윈도우
    /// </summary>
    public partial class MainWindow : Window
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainWindow()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();
        }

        #endregion
    }
}

 

▶ MainWindowViewModel.cs

using Prism.Mvvm;

using TestLibrary;

namespace TestProject.ViewModels
{
    /// <summary>
    /// 메인 윈도우 뷰 모델
    /// </summary>
    public class MainWindowViewModel : BindableBase
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 애플리케이션 명령
        /// </summary>
        private IApplicationCommand applicationCommand;

        /// <summary>
        /// 제목
        /// </summary>
        private string title = "IActiveAware 인터페이스 : 활성 명령만 호출하기";

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 제목 - Title

        /// <summary>
        /// 제목
        /// </summary>
        public string Title
        {
            get
            {
                return this.title;
            }
            set
            {
                SetProperty(ref this.title, value);
            }
        }

        #endregion
        #region 애플리케이션 명령 - ApplicationCommand

        /// <summary>
        /// 애플리케이션 명령
        /// </summary>
        public IApplicationCommand ApplicationCommand
        {
            get
            {
                return this.applicationCommand;
            }
            set
            {
                SetProperty(ref this.applicationCommand, value);
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainWindowViewModel(applicationCommand)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="applicationCommand">애플리케이션 명령</param>
        public MainWindowViewModel(IApplicationCommand applicationCommand)
        {
            ApplicationCommand = applicationCommand;
        }

        #endregion
    }
}

 

▶ MainApplication.xaml

<prism:PrismApplication x:Class="TestProject.MainApplication"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/">
</prism:PrismApplication>

 

▶ MainApplication.xaml.cs

using System.Windows;

using Prism.Ioc;
using Prism.Modularity;
using Prism.Unity;

using TestLibrary;
using TestModule;
using TestProject.Views;

namespace TestProject
{
    /// <summary>
    /// 메인 애플리케이션
    /// </summary>
    public partial class MainApplication : PrismApplication
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 쉘 생성하기 - CreateShell()

        /// <summary>
        /// 쉘 생성하기
        /// </summary>
        /// <returns>쉘</returns>
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        #endregion
        #region 모듈 카탈로그 구성하기 - ConfigureModuleCatalog(moduleCatalog)

        /// <summary>
        /// 모듈 카탈로그 구성하기
        /// </summary>
        /// <param name="moduleCatalog">모듈 카탈로그</param>
        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            moduleCatalog.AddModule<TestModuleModule>();
        }

        #endregion
        #region 타입 등록하기 - RegisterTypes(containerRegistry)

        /// <summary>
        /// 타입 등록하기
        /// </summary>
        /// <param name="containerRegistry">컨테이너 레지스트리 인터페이스</param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterSingleton<IApplicationCommand, ApplicationCommand>();
        }

        #endregion
    }
}
728x90
반응형
Posted by 사용자 icodebroker
TAG , , ,

댓글을 달아 주세요