Как обновить 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;
}