■ IActiveAware 인터페이스를 사용해 활성 명령만 호출하는 방법을 보여준다.
[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(true); #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 UpdatedText}" /> </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 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
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
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 = "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
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 } } |