xamarin-forms-docs/knowledge-base/slideview-access-parent-bin...

2.8 KiB

title description type page_title slug position tags ticketid res_type
RadSlideView Access Parent BindingContext in Slide How to get access the BindingContext of the parent within the SlideView's ContentViews how-to SlideView Access Parent BindingContext in Slide radslideview-access-parent-bindingcontext RadSlideView, BindingContext, Slide, Parent, ContentView, Xamarin, XamarinForms 1362624 kb

Environment

Product Version 2018.3.1122.3
Product SlideView for Xamarin.Forms

Description

The RadSlideView uses ContentView for the slides, these ContentViews do not have scope to BindingContext of the visual parents (e.g. the SlideView or parent page). This has the consequence of not being able to bind any ContentView content to a page view model.

Solution

You can solve this by using a static helper class to share a BindingContext reference. The static class only needs one public static object property:

Example Helper Class

public static class BindingContextHelper
{
    public static object CurrentPageBindingContext { get; set; }
}

Example Use

When the RadSlideView parent's BindingContext is set, you can set the helper class's property. In this example, we'll use a ContentPage.

Model

public class MyItem
{
    public string ItemName { get; set; }
}

ViewModel

public class ViewModel
{
    public ViewModel()
    {
    }

    public ObservableCollection<MyItem> MyItems { get; set; } = new ObservableCollection<MyItem>
    {
        new MyItem {ItemName = "Item One"}
    };

    public Command MyViewModelCommand { get; set; } = new Command(() =>
    {
            Debug.WriteLine("You have invoked a command in the view model!");
    });
}

View

<telerikPrimitives:RadSlideView ItemsSource="{Binding MyItems}">
  <telerikPrimitives:RadSlideView.ItemTemplate>
    <DataTemplate>
      <ContentView>
        <StackLayout >
          <Label Text="{Binding ItemName}" />
          <Button BindingContext="{x:Static helpers:BindingContextHelper.CurrentPageBindingContext}"
                  Command="{Binding MyViewModelCommand}" />
                </Grid>
            </ContentView>
        </DataTemplate>
    </telerikPrimitives:RadSlideView.ItemTemplate>
</telerikPrimitives:RadSlideView>
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        // Set the parent's BindingContext
        this.BindingContext = new ViewModel();

        // Pass that BindingContext to the helper class
        BindingContextHelper.CurrentPageBindingContext = this.BindingContext;
    }
}