2017-01-28 3 views
1

Я пытаюсь реализовать салфетки влево и вправо на мой Frame с помощью FrameRenderer. У меня есть следующий код (минимальное) в XAML:Как обновить BindingContext Grid внутри салфетки влево/вправо в пользовательском рендерере?

<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# код я следующее:

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

PS: Я очень новичок в настраиваемом рендерере.

ответ

0

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

var grid = Element?.Content as Layout<Xamarin.Forms.View>; 
if (grid != null) 
{ 
    grid.BindingContext = newBindingContext; 
} 
Смежные вопросы