TabStripPlacement binding exception in TabItem
- 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
Assessment
This issue has not been assessed yet.