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

■ CompositeCommand 클래스 :  다수 명령을 하나의 명령으로 사용하기

------------------------------------------------------------------------------------------------------------------------


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();

 

        #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 UpdateText}" />

    </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.Commands;

using Prism.Mvvm;

 

using TestLibrary;

 

namespace TestModule.ViewModels

{

    /// <summary>

    /// 탭 뷰 모델

    /// </summary>

    public class TabViewModel : BindableBase

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// 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;

 

        #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 업데이트 텍스트 - UpdateText

 

        /// <summary>

        /// 업데이트 텍스트

        /// </summary>

        public string UpdateText

        {

            get

            {

                return this.updatedText;

            }

            set

            {

                SetProperty(ref this.updatedText, value);

            }

        }

 

        #endregion

        #region 업데이트 명령 - UpdateCommand

 

        /// <summary>

        /// 업데이트 명령

        /// </summary>

        public DelegateCommand UpdateCommand { get; private set; }

 

        #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()

        {

            UpdateText = $"Updated : {DateTime.Now}";

        }

 

        #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 = "CompositeCommand 클래스 :  다수 명령을 하나의 명령으로 사용하기";

 

        #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

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요