Xamarin form: How to reference to the parent binding

24,387

Solution 1

@qubuss gave the correct answer below, but I would like to give more context and show an example to make it more clear:

Lets consider the following page:

<ContentPage  
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Name="firstPage" -->this reference parent context
    x:Class="Your_Class_Name">
  <ListView x:Name="ListSource"
            ItemsSource="{Binding ListSource}" >
            <ListView.ItemTemplate>
               <DataTemplate>
                   <ViewCell>
                        <Grid>
                         // this come from item source
                    <Label Text="{Binding ABC}"></Label>
                    <Button Command="{Binding BindingContext.CommandFromParent
                           , Source={x:Reference firstPage} }" />
                        </Grid>
                                                
                       </ViewCell>
                  /DataTemplate>
           </ListView.ItemTemplate>
    </ListView>


</ContentPage>

your view Model should look like that

 public class ViewModelName 
    {
        private List<YourDataType> _listSource = new List<YourDataType>();
        

        public List<YourDataType> ListSource
        {
            get => _listSource;
            set
            {
                _listSource = value;
                RaisePropertyChanged();
            }
        }

        public ICommand CommandFromParent => new Command(HandleYourActionHere);

}
}

Explanation When we write BindingContext.CommandFromParent, BindingContext represents the BindingContext of firstPage(x:Name="firstPage") which is of type ViewModelName

Solution 2

You can bind to an ancestor with a RelativeSource.

Change this line

<Label Text="{Binding ABC}"></Label>

to this

<Label Text="{Binding ABC, Source={RelativeSource AncestorType={x:Type viewModel:YourViewModelName}}}"></Label>

Don't forget to add the xml namespace for viewModel on top of the file:

xmlns:viewModel="clr-namespace:YourProject.ViewModels"

You can read all about RelativeSource bindings here: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/relative-bindings#bind-to-an-ancestor

Solution 3

You need to add BindingContext="{x:Reference viewmodel} inside label.

<ViewCell> 
  <ViewCell.View>
    <Label Text="{Binding ABC}" BindingContext="{x:Reference Name_Of_Parent}"></Label>
  </ViewCell.View>
</ViewCell>

in Name_Of_Parent you put name of component. If you use MVVM and ViewModel class you have to add x:Name to your binding Context:

<ContentPage.BindingContext>
    <mvvm:MasterPageModel 
    x:Name="viewmodel"/>
</ContentPage.BindingContext>

This is documentation which describe it.

Solution 4

Give content page a name:

<ContentPage x:Name="this">

Access page's binding context like this:

  <Label BindingContext="{Binding Source={x:Reference this}, Path=BindingContext}" >

Solution 5

DataContext.Command works for me.

<ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Name="firstPage"
    x:Class="Your_Class_Name">
    <ListView x:Name="ListSource" ItemsSource="{Binding ListSource}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid>
                        <Label Text="{Binding ABC}"></Label>
                        <Button Command="{Binding BindingContext.CommandFromParent, Source={x:Reference firstPage} }" />
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage>
Share:
24,387
LittleFunny
Author by

LittleFunny

Updated on October 27, 2021

Comments

  • LittleFunny
    LittleFunny over 2 years
    <ViewCell> 
       <ViewCell.View>
          <Label Text="{Binding ABC}"></Label>
       </ViewCell.View>
    </ViewCell>
    

    Assuming this viewcell was inside ListView. If the content page was binding with a view model, how can I get a reference to the content page's binding. Currently, 'ABC' is referencing the property of an object in the list but i want to get the value from the content page's bindingcontext.

    <ffimageloading:CachedImage.GestureRecognizers>
       <TapGestureRecognizer BindingContext="{x:Reference page}" Command="{Binding OnSignInCommand}" CommandParameter="{Binding Model}" />
    </ffimageloading:CachedImage.GestureRecognizers>