dotnet / dotnet/wpf

TabStripPlacement binding exception in TabItem

Open
#6,440 2 comments 6 reactions 1 assignee Claimed by @singhashish-wpf View on GitHub
Investigate
Dominant language
C#
Stars
7.7k
Forks
1.3k
Avg merge
1d 11h
Merged PRs (30d)
61

Description

* .NET Core Version: 6.0.100
* Windows version: Windows 10 Version 20H2 (OS Build 19042.1645)
* Does the bug reproduce also in WPF for .NET Framework 4.8?: Yes

**Problem description:**
Binding failure occurs when removing last item (last tab) from TabControl. This is independent of whether MVVM or code behind is being used.

**Actual behavior:**
When deleting the last tab I get an error:
```
Binding Path: TabStripPlacement;
Target: TabItem;
Description: Cannot find source: RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TabControl', AncestorLevel='1'
```
**Expected behavior:**
Binding exception does not occur

**Minimal repro:**
Delete tabs with buttons "Remove last" or "Remove all"
MainWindow.xaml:
```






















```
MainWindow.xaml.cs:
```
using System;
using System.Windows;

namespace TabControlBug
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
AddItem();
AddItem();
AddItem();
}

private void Add_OnClick(object sender, RoutedEventArgs e)
{
AddItem();
}

private void RemoveLast_OnClick(object sender, RoutedEventArgs e)
{
if (TabControl.Items.Count > 0)
{
TabControl.Items.RemoveAt(TabControl.Items.Count - 1);
}
}

private void RemoveAll_OnClick(object sender, RoutedEventArgs e)
{
TabControl.Items.Clear();
}

private void AddItem()
{
var newItem = new TabItemViewModel
{
Header = Guid.NewGuid().ToString().Substring(0, 3),
Text = Guid.NewGuid().ToString()
};

TabControl.Items.Add(newItem);
}
}
}
```
TabItemViewModel.cs:
```
using System.ComponentModel;
using System.Runtime.CompilerServices;
using TabControlBug.Annotations;

namespace TabControlBug
{
public class TabItemViewModel : INotifyPropertyChanged
{
private string _text;
private string _header;

public string Header
{
get => _header;
set
{
_header = value;
OnPropertyChanged(nameof(Header));
}
}

public string Text
{
get => _text;
set
{
_text = value;
OnPropertyChanged(nameof(Text));
}
}

public event PropertyChangedEventHandler? PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.