안녕하세요, 반나무입니다.
지난 예제에서는 View와 ViewModel을 자동으로 연결했었는데요 이번 예제에서는 자동으로 연결되는 조건을 변경하는 방법을 안내합니다.
ChangeConvention 예제
// App.xaml.cs
public partial class App : PrismApplication
{
protected override Window CreateShell() => Container.Resolve<MainWindow>();
protected override void RegisterTypes(IContainerRegistry containerRegistry){}
// View,ViewModel 자동연결 조건 변경
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
var viewName = viewType.FullName;
var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
var viewModelName = $"{viewName}ViewModel, {viewAssemblyName}";
return Type.GetType(viewModelName);
});
}
핵심 부분인 ConfigureViewModelLocator 함수를 자세히 살펴보겠습니다.
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
// view의 명
var viewName = viewType.FullName;
// view의 어셈블리명
var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
// viewModel의 명
var viewModelName = $"{viewName}ViewModel, {viewAssemblyName}";
return Type.GetType(viewModelName);
});
이 부분을 디버깅해보면 다음과 같습니다.
- viewName = ViewModelLocator.Views.MainWindow
- viewAssemblyName = ViewModelLocator, Version=1.0.0.0, Culture=neutral, PublickeyToken=null
- viewModelName = ViewModelLocator.Views.MainWindowViewModel, ViewModelLocator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
지난 예제와 이번 예제의 다른점이 여기 부분입니다.
지난 예제의 경우 ViewModels Namespace안에 들어가있어야지만 자동으로 연결 되었는데요
이번 예제는 Views Namespace안에 들어가 있어야 자동으로 연결됩니다.
8번 예제 자동 연결 구조
그렇다면 기존 예제는 어떤 구조로 자동으로 연결된건지 확인도 한번 해봐야겠죠?
SetDefaultViewTypeToViewModelTypeResolver 함수를 F12로 타고 들어가면 다음과 같은 부분이 나옵니다.
summary부분을 해석하면 다음과 같습니다.
ViewModel 유형 확인기의 기본 뷰 유형 확인기는 ViewModel이 View 유형과 동일한 어셈블리에 있지만 "ViewModels" 네임스페이스에 있다고 가정합니다.
viewName.Replace(".Views.", ".ViewModels.");
이 코드 때문에 ViewModels 네임스페이스를 사용해야했던겁니다.
suffix : MainWindow가아니라 MainView라면?
코드를 자세히 보다보니 suffix 부분이 있습니다.
어떤 View가 View로 끝나면 Model / View로 끝나지 않으면 ViewModel이 되네요
그렇기 때문에 MainWindow는 MainWindowViewModel을 자동으로 연결합니다.
만일 MainWindow를 MainView로 변경한다면 어떨까요?
MainWindowViewModel을 MainViewModel로 변경시 View와 ViewModel이 자동으로 잘 연결되는것을 확인 할 수 있습니다.
viewModelName 부분을 자유롭게 변경해 사용자가 원하는 폴더 구조에서 View와 ViewModel을 자동으로 연결 할 수 있게 해주는 좋은 기능인것 같습니다.
'C# > Prism' 카테고리의 다른 글
[C# - Prism] 프리즘 예제 11 - UsingDelegateCommand (0) | 2023.08.05 |
---|---|
[C# - Prism] 프리즘 예제 10 - CustomRegistrations (0) | 2023.07.26 |
[C# - Prism] 프리즘 예제 08 - ViewModelLocator (0) | 2023.07.25 |
[C# - Prism] 프리즘 예제 07 - Modules (0) | 2023.07.23 |
[C# - Prism] 프리즘 예제 06 - ViewActivationDeactivation (0) | 2023.07.23 |
3년차 WPF 개발자입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!