■ CompositeCommand 클래스를 사용해 복수 명령을 하나의 명령으로 사용하는 방법을 보여준다.
[TestLibrary 프로젝트]
▶ IApplicationCommand.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using Prism.Commands; namespace TestLibrary { /// <summary> /// 애플리케이션 명령 인터페이스 /// </summary> public interface IApplicationCommand { //////////////////////////////////////////////////////////////////////////////////////////////////// Property #region 저장 명령 - SaveCommand /// <summary> /// 저장 명령 /// </summary> CompositeCommand SaveCommand { get; } #endregion } } |
▶ ApplicationCommand.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
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
1 2 3 4 5 6 7 |
<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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
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 } } |