Skip to content

TabView using TabItemsSource binding seems to recycle/cache ViewModel instances? #10297

@elbrandt

Description

@elbrandt

Describe the bug

Is this a bug in TabView implementation? Or what could I be doing wrong?

Summary:

Binding seems to get out of sync when adding and removing tabs from tab TabView.

Minimal Working Example that Demonstrates the Issue:

Code for minimal working example that demonstrates the issue here:

https://github.com/elbrandt/WinUI3_TabView_Binding_Issue

Description:

In a desktop WinUI3 app, using .NET8, I have a TabView that has its TabItemsSource property bound to an ObservableCollection of TabViewModel instances in the page's ViewModel class.

Each time a new tab button is clicked, a ViewModel command method is executed, which instantiates a TabViewModel class and adds it to the ObservableCollection. The TabViewModel class has a single integer property, MyNumber that is initialized to a unique, monotonically increasing integer.

The MyNumber property is bound to both the TabViewItem's Header property, as well as to a TextBlock in a custom control that is the content of the TabViewItem

Behavior (Reproducing):

The Header and and TextBlock should always be in sync, since they are bound to the same member of the object that is the DataContext for the TabViewItem.

However, if you 1. Add two tabs, 2. Close the two tabs, 3. Add another tab, then you will see the two UI elements are no longer in sync.

What is going on? Am I doing something wrong? Or is this a bug in the TabView code?

Thanks in advance!

(I have cross posted this to https://stackoverflow.com/questions/79353040/winui3-tabview-binding-not-updating-correctly-recycling-instances as well, in hopes of getting an answer somewhere, quickly).

Steps to reproduce the bug

clone and build this minimal working example:
https://github.com/elbrandt/WinUI3_TabView_Binding_Issue

when running,

  1. Add two tabs using the button
  2. View the two tabs (activate them by clicking on the headers). Notice the header and contents are in sync.
  3. Close those two tabs
  4. Add another tabNotice that the header and the content are not in sync, even though they are bound to the same VM property.

Expected behavior

The header and the content should be in sync, since they are bound to the same VM property.

Screenshots

Image

NuGet package version

None

Windows version

Windows 11 (23H2): Build 22631

Additional context

If the problem is in my code in the MWE, please help me understand what is wrong that is causing this. Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds-triageIssue needs to be triaged by the area owners

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions