Как обновить BindingContext из Grid внутри жеста влево / вправо в пользовательском рендерере?

Я пытаюсь осуществить движение пальцем влево и вправо к моему Frame с использованием FrameRenderer, У меня есть следующий код (минимальный) в XAML:

<Frame x:Name="swipeableFrame" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
   <Grid x:Name="favoritesGrid"> <!--Update BindingContext -->
      <Grid.RowDefinitions>
         <RowDefinition Height="*" />
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="*" />
      </Grid.ColumnDefinitions>

      <Grid Grid.Row="0" Grid.Column="0">
         <Grid.RowDefinitions>
            <RowDefinition Height="50*" />
            <RowDefinition Height="50*" />
         </Grid.RowDefinitions>
         <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
         </Grid.ColumnDefinitions>
         <StackLayout Grid.Row="0" Grid.Column="0">
            <Label x:Name="englishLabel" FontSize="40" />
         </StackLayout>
         <StackLayout Grid.Row="1" Grid.Column="0">
            <Label x:Name="romajiLabel" FontSize="40" />
         </StackLayout>
     </Grid>
  </Grid>
</Frame>

В моем собственном коде C# рендерера у меня есть следующее:

public class FrameCustomRenderer : FrameRenderer
{
    UISwipeGestureRecognizer leftSwipeGestureRecognizer;
    UISwipeGestureRecognizer rightSwipeGestureRecognizer;

    protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
    {
        base.OnElementChanged(e);
        Forms.Init();

        leftSwipeGestureRecognizer = new UISwipeGestureRecognizer();
        leftSwipeGestureRecognizer.Direction = UISwipeGestureRecognizerDirection.Left;
        leftSwipeGestureRecognizer.AddTarget((obj) =>
        {
            App.index++;
            Console.WriteLine("Swiped left");
            App.favoriteWords = App.DB.GetFavoritePhrases();
            App.favoriteWord = App.favoriteWords[App.index];
            //I want to update the BindingContext of the favoritesGrid here
        });
        rightSwipeGestureRecognizer = new UISwipeGestureRecognizer();
        rightSwipeGestureRecognizer.Direction = UISwipeGestureRecognizerDirection.Right;
        rightSwipeGestureRecognizer.AddTarget((obj) =>
        {
            App.index--;
            Console.WriteLine("Swiped right");
            App.favoriteWords = App.DB.GetFavoritePhrases();
            App.favoriteWord = favoriteWords[App.index];
            //I want to update the BindingContext  of the favoritesGrid here
        });

        if (e.NewElement == null)
        {
            if (leftSwipeGestureRecognizer != null || rightSwipeGestureRecognizer != null)
            {
                this.RemoveGestureRecognizer(leftSwipeGestureRecognizer);
                this.RemoveGestureRecognizer(rightSwipeGestureRecognizer);
            }
        }

        if (e.OldElement == null)
        {
            this.AddGestureRecognizer(leftSwipeGestureRecognizer);
            this.AddGestureRecognizer(rightSwipeGestureRecognizer);
        }
    }
}

В моем коде C# целевого класса у меня есть следующее:

public partial class FavoritesFrameRendererClass : Frame
{
    public FavoritesFrameRendererClass()
    {
        InitializeComponent();
    }

    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();
        App.favoriteWords = App.DB.GetFavoritePhrases();
        App.favoriteWord = App.favoriteWords[App.index];
        favoritesGrid.BindingContext = App.favoriteWord;

        englishLabel.SetBinding(Label.TextProperty, Lang.English.Text());
        romajiLabel.SetBinding(Label.TextProperty, Lang.Romaji.Text());
    }
}

Что это в основном делает, если я проведу пальцем влево, это даст мне следующее слово в List и если я проведу вправо, это даст мне предыдущее слово. Сейчас жесты влево и вправо дают мне нужные слова, которые я хотел получить, но моя сетка не обновляется, чтобы отобразить правильные слова. Любые идеи, как я могу это реализовать?

PS: я очень новый пользовательский рендерер.

1 ответ

Решение

Поскольку BindingContext находится в Grid внутри вашего фрейма, вы должны иметь возможность получить Grid из содержимого фрейма в вашем FrameRenderer и установить его BindingContext в коде, выполнив что-то вроде этого:

var grid = Element?.Content as Layout<Xamarin.Forms.View>;
if (grid != null)
{
    grid.BindingContext = newBindingContext;
}
Другие вопросы по тегам