Hi,
Welcome to Microsoft Q&A!
I tested the code that you provided. I found that the issue lies in the TabView reusing items.
Based on Andrew's suggestion on SO, you could try to use a DependencyProperty
.
Thank you
Jeanine
This browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
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).
Hi,
Welcome to Microsoft Q&A!
I tested the code that you provided. I found that the issue lies in the TabView reusing items.
Based on Andrew's suggestion on SO, you could try to use a DependencyProperty
.
Thank you
Jeanine
I found that if I manually force an update of the bindings of the TabViewItem
's Content
property, then the content will again be in sync. I have updated the MWE code with a branch containing this workaround
https://github.com/elbrandt/WinUI3_TabView_Binding_Issue/tree/workaround
As a general comment:
The 'reuse' of the control and mismatch of bound data context may indeed be 'as designed', and probably helps with performance if there are many many tabs (which is unlikely to be the case...), but I fail to see how this design is 'expected behavior' for anyone using the class. Even if the TabView has no implementation bugs per this design, I'd consider this a 'design bug' (or a 'documentation bug') because it is certainly not the expected behavior as a consumer of the class.