--- name: mapping-viewmodel-view-datatemplate description: "Implements automatic ViewModel-View mapping using DataTemplate for navigation scenarios. Use when building dynamic content display or implementing navigation between views in WPF." --- # 5.8 Automatic View-ViewModel Mapping Using DataTemplate In WPF, DataTemplate allows automatic mapping between ViewModel types and Views. This pattern is very useful for navigation scenarios and dynamic content display. ## Project Structure The templates folder contains a WPF project example (use latest .NET per version mapping). ``` templates/ ├── WpfDataTemplateSample.App/ ← WPF Application Project │ ├── Views/ │ │ ├── HomeView.xaml │ │ ├── HomeView.xaml.cs │ │ ├── SettingsView.xaml │ │ └── SettingsView.xaml.cs │ ├── App.xaml │ ├── App.xaml.cs │ ├── MainWindow.xaml │ ├── MainWindow.xaml.cs │ ├── Mappings.xaml ← DataTemplate mapping definitions │ ├── GlobalUsings.cs │ └── WpfDataTemplateSample.App.csproj └── WpfDataTemplateSample.ViewModels/ ← ViewModel Class Library ├── MainWindowViewModel.cs ├── HomeViewModel.cs ├── SettingsViewModel.cs ├── GlobalUsings.cs └── WpfDataTemplateSample.ViewModels.csproj ``` #### 5.8.1 Core Concept **When you bind a ViewModel instance to ContentControl's Content, WPF automatically finds the corresponding DataTemplate for that ViewModel type and renders the View.** Key points of this pattern: 1. Define DataTemplates for each ViewModel type in `Mappings.xaml` 2. Bind ViewModel instances to `ContentControl.Content` 3. WPF automatically matches types and renders the corresponding View #### 5.8.2 Mappings.xaml Pattern **Mappings.xaml - Define ViewModel and View mappings:** ```xml ``` **App.xaml - Merge Mappings.xaml into Application Resources:** ```xml ``` #### 5.8.3 Navigation Pattern Implementation **MainWindowViewModel - Screen navigation via CurrentViewModel property:** ```csharp // ViewModels/MainWindowViewModel.cs namespace WpfDataTemplateSample.ViewModels; public sealed partial class MainWindowViewModel : ObservableObject { [ObservableProperty] private object? _currentViewModel; public MainWindowViewModel() { CurrentViewModel = new HomeViewModel(); } [RelayCommand] private void NavigateToHome() { CurrentViewModel = new HomeViewModel(); } [RelayCommand] private void NavigateToSettings() { CurrentViewModel = new SettingsViewModel(); } [RelayCommand] private void NavigateToUserProfile() { CurrentViewModel = new UserProfileViewModel(); } } ``` **MainWindow.xaml - Display dynamic content with ContentControl:** ```xml