---
name: displaying-slider-index
description: "Displays 0-based collection indices as 1-based numbers in WPF Slider controls. Use when showing user-friendly slice/page numbers while maintaining 0-based internal indexing."
---
# WPF Slider 0-based Index Display Pattern
## Problem Scenario
When displaying collection indices with a slider, **internally using 0-based index** but **displaying as 1-based to users** is a common requirement.
### Symptoms
- 120 images exist but displayed as "0 / 120" ~ "119 / 120"
- Users expect "1 / 120" ~ "120 / 120"
- Dragging slider to the end doesn't reach the last item
### Cause
- If slider's `Maximum` is set to `TotalCount`, it exceeds the valid range
- Displaying 0-based index directly confuses users
---
## Solution
### Add Display Properties to ViewModel
```csharp
public partial class ViewerViewModel : ObservableObject
{
// Internal index (0-based)
[NotifyPropertyChangedFor(nameof(SliceDisplayNumber))]
[ObservableProperty] private int _currentSliceIndex;
// Total count
[NotifyPropertyChangedFor(nameof(MaxSliceIndex))]
[ObservableProperty] private int _totalSliceCount;
///
/// Slider Maximum value (0-based index maximum)
///
public int MaxSliceIndex => Math.Max(0, TotalSliceCount - 1);
///
/// User display number (1-based)
///
public int SliceDisplayNumber => CurrentSliceIndex + 1;
}
```
### XAML Binding
```xml
```
---
## Key Points
| Property | Value Range | Purpose |
|----------|-------------|---------|
| `CurrentSliceIndex` | 0 ~ (Count-1) | Internal logic, Slider Value |
| `MaxSliceIndex` | Count-1 | Slider Maximum |
| `SliceDisplayNumber` | 1 ~ Count | User display |
| `TotalSliceCount` | Count | Total count display |
---
## Using NotifyPropertyChangedFor
The `[NotifyPropertyChangedFor]` attribute automatically raises `PropertyChanged` for computed properties when the source property changes.
```csharp
// When CurrentSliceIndex changes, SliceDisplayNumber also raises PropertyChanged
[NotifyPropertyChangedFor(nameof(SliceDisplayNumber))]
[ObservableProperty] private int _currentSliceIndex;
// When TotalSliceCount changes, MaxSliceIndex also raises PropertyChanged
[NotifyPropertyChangedFor(nameof(MaxSliceIndex))]
[ObservableProperty] private int _totalSliceCount;
```
---
## Application Examples
- Image viewer slice navigation (CT/MRI)
- Pagination (document viewer)
- Media player track list
- Gallery image index