---
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
```
```csharp
// MainWindow.xaml.cs
using WpfDataTemplateSample.ViewModels;
namespace WpfDataTemplateSample;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
}
}
```
#### 5.8.4 ViewModel and View Implementation Examples
**HomeViewModel:**
```csharp
// ViewModels/HomeViewModel.cs
namespace WpfDataTemplateSample.ViewModels;
public sealed partial class HomeViewModel : ObservableObject
{
[ObservableProperty] private string _welcomeMessage = "Welcome to Home Page!";
[ObservableProperty] private string _description = "This is the home page content. DataTemplate automatically maps this ViewModel to HomeView.";
}
```
**HomeView:**
```xml
```
```csharp
// Views/HomeView.xaml.cs
namespace WpfDataTemplateSample.Views;
public partial class HomeView : UserControl
{
public HomeView()
{
InitializeComponent();
}
}
```
#### 5.8.5 Core Principles
1. **DataTemplate's DataType attribute**: Specifies ViewModel type for automatic mapping
2. **Define without x:Key**: When only DataType is specified, WPF automatically searches by type
3. **Use ContentControl**: Bind ViewModel instance to the Content property
4. **Register in Application Resources**: Merge Mappings.xaml via MergedDictionaries in App.xaml
5. **Views as UserControls**: Define Views as reusable UserControls
#### 5.8.6 Advantages
1. **Reduced View-ViewModel coupling**: No direct View creation in Code-Behind
2. **Declarative mapping**: Explicitly define mapping relationships in XAML
3. **Simplified navigation**: Automatic screen transitions by simply replacing ViewModel instances
4. **Testability**: Logic can be tested with ViewModel alone
5. **Design-time support**: Designer preview support via `d:DataContext`
#### 5.8.7 Important Notes
**⚠️ Important:**
- DataTemplate must be defined without `x:Key` for automatic mapping to work
- Mappings.xaml must be merged into Application.Resources
- ViewModel types must match exactly (inheritance relationships are not considered)
- Bind ViewModel instances (not types) to ContentControl.Content
- Views automatically receive DataContext (no separate configuration needed)
#### 5.8.8 Project Structure Example
```
WpfDataTemplateSample/
├── ViewModels/
│ ├── MainWindowViewModel.cs
│ ├── HomeViewModel.cs
│ ├── SettingsViewModel.cs
│ └── UserProfileViewModel.cs
├── Views/
│ ├── HomeView.xaml
│ ├── HomeView.xaml.cs
│ ├── SettingsView.xaml
│ ├── SettingsView.xaml.cs
│ ├── UserProfileView.xaml
│ └── UserProfileView.xaml.cs
├── App.xaml
├── App.xaml.cs
├── MainWindow.xaml
├── MainWindow.xaml.cs
├── Mappings.xaml ← DataTemplate mapping definitions
└── GlobalUsings.cs
```
---
#### 5.8.9 HierarchicalDataTemplate for TreeView
For hierarchical data structures (e.g., folder trees, organization charts), use `HierarchicalDataTemplate`.
**ViewModel with Hierarchical Data:**
```csharp
// ViewModels/FolderViewModel.cs
namespace MyApp.ViewModels;
public sealed partial class FolderViewModel : ObservableObject
{
[ObservableProperty] private string _name = string.Empty;
[ObservableProperty] private ObservableCollection _children = [];
[ObservableProperty] private bool _isExpanded;
[ObservableProperty] private bool _isSelected;
public FolderViewModel(string name)
{
Name = name;
}
public FolderViewModel(string name, IEnumerable children)
: this(name)
{
foreach (var child in children)
{
Children.Add(child);
}
}
}
```
**HierarchicalDataTemplate in XAML:**
```xml
```
**TreeView Usage:**
```xml
```
**Multiple ViewModel Types in Tree:**
```xml
```
**Key Differences:**
| DataTemplate | HierarchicalDataTemplate |
|--------------|-------------------------|
| Flat data | Hierarchical/nested data |
| No children | Has ItemsSource for children |
| ContentControl | TreeView, Menu, MenuItem |
---