XamarinCommunityToolkit icon indicating copy to clipboard operation
XamarinCommunityToolkit copied to clipboard

[Bug] TabView does not allow to change BindingContext

Open SeRgI1982 opened this issue 4 years ago • 3 comments

Description

Because TabViewItem content can be heavy and it can be related with very thick ViewModel, I would like to delegate (separate) this data management to another ViewModel's which are injected into my MainPageViewModel.

Steps to Reproduce

  1. Create Page with TabView and a few TabViewItem's
  2. Create ViewModel for that Page with property referenced to another ViewModel
  3. Bind BindingContext of TabViewItem.Content to this another ViewModel

Expected Behavior

TabViewItem.Content.BindingContext points to property in visible in XAML

Actual Behavior

TabViewItem.Content.BindingContext automatically switch to main Page ViewModel

Basic Information

  • Version with issue: 1.0.3 like also 1.1.0-pre1

  • IDE: VS for Mac

  • Platform Target Frameworks:

    • iOS: Xcode Version 12.4 (12D4e)
    • Android: 10.0

Sample app below:

Steps:

  1. Run sample app,
  2. Click Button
  3. TabViewItem's with indexes 1, 2, 3, 4 have content with BindingContext bounded to AnotherViewModel
  4. Take a look on Label "BindingContextType" <- is different than what we have in XAML. Why ?

TabViewTest.zip

SeRgI1982 avatar Feb 25 '21 11:02 SeRgI1982

Unfortunately, it looks like every time the binding context of the TabView changes, it sets each of the TabViewItems to the same BindingContext as the TabView.

https://github.com/xamarin/XamarinCommunityToolkit/blob/main/src/CommunityToolkit/Xamarin.CommunityToolkit/Views/TabView/TabView.shared.cs#L430

j-fritsch avatar Mar 03 '21 22:03 j-fritsch

I also have this requirement, and I have been able to find a workaround.

Initially, I was assigning BindingContext property directly in my MainView XAML file, for each TabViewItem component:

    <xct:TabView>
            <xct:TabViewItem>
                <view:TabView1 x:Name="TabView1" BindingContext = "{Binding TabView1ViewModel}"/>
            </xct:TabViewItem>
            <xct:TabViewItem>
                <view:TabView2 x:Name="TabView2" BindingContext = "{Binding TabView2ViewModel}"/>
            </xct:TabViewItem>
            <xct:TabViewItem>
                <view:TabView3 x:Name="TabView3" BindingContext = "{Binding TabView3ViewModel}"/>
            </xct:TabViewItem>
        </xct:TabView>

But instead, I assign BindingContext property for each in "OnAppearing" method of my MainView:

protected override void OnAppearing()
        {
            TabView1.BindingContext = (this.BindingContext as MainViewModel).TabView1ViewModel;
            TabView2.BindingContext = (this.BindingContext as MainViewModel).TabView2ViewModel;
            TabView3.BindingContext = (this.BindingContext as MainViewModel).TabView3ViewModel;
    }

Kapusch avatar Mar 04 '21 12:03 Kapusch

I am experiencing the same issue.

Elifas-TeQ avatar Dec 15 '22 12:12 Elifas-TeQ