Я работал над моим приложением Xamarin.Forms, пытаясь заставить Предметы внутри моего прокрутки изменять свое свойство TransitionX при прокрутке, проблема в том, что после того, как скролл-просмотр был показан, элементы внутри него не изменятся, как источник, если только Вы переназначаете carouselview.ItemSource, но я не могу этого сделать, потому что это было бы крайне неэффективно и прокрутка была бы ужасной. Так есть ли способ динамически отражать изменения, сделанные в источнике, в carouselView?
Вот мой код, я написал комментарии, чтобы сделать его как можно более понятным: CarouselView:
<MasterDetailPage.Detail>
<ContentPage Title="title">
<StackLayout
x:Name="page">
<CarouselView
x:Name="carousel"
VerticalOptions="StartAndExpand"
HorizontalOptions="StartAndExpand"
BackgroundColor="Transparent"
Scrolled="carousel_Scrolled">
<CarouselView.Behaviors>
<behaviors:CarouselViewParallaxBehavior ParallaxOffset="100"/>
</CarouselView.Behaviors>
<CarouselView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid>
//Here goes more content which is irrelevant for this matter
</Grid>
<Image
Source="{Binding ImageSrc}"
BackgroundColor="Transparent"
HeightRequest="500"
//This is the property I am trying to change when scrolling
TranslationX="{Binding Position}"
VerticalOptions="Center"
HorizontalOptions="Center"
Margin="0,-160,0,0"></Image>
</Grid>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
</StackLayout>
</ContentPage>
</MasterDetailPage.Detail>
Мой код xaml.cs:
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class HomePage : MasterDetailPage
{
private List<Color> _backgroundColorscount = new List<Color>();
private List<Color> _backgroundColors = new List<Color>();
private List<Product> Items;
private static double position = 0;
public HomePage()
{
InitializeComponent();
//These are the items of my carouselView
Items = new List<Product>()
{
// Just create some dummy data here for now.
new Product{Title = "Classic burguer", Price = "124$", ImageSrc = "Burguer.png", StartColor = Color.FromHex("#DF8000"), EndColor = Color.FromHex("#DCD800")},
new Product{Title = "Classic burguer", Price = "124$", ImageSrc = "Burguer.png", StartColor = Color.FromHex("#15DE00"), EndColor = Color.FromHex("#BADE00")},
new Product{Title = "Classic burguer", Price = "124$", ImageSrc = "Burguer.png", StartColor = Color.FromHex("#00DEAD"), EndColor = Color.FromHex("#DCD800")}
};
carousel.ItemsSource = Items;
}
private void carousel_Scrolled(object sender, ItemsViewScrolledEventArgs e)
{
//Here is what I am trying to do (I wrote it right now to show the problem)
Items[0].Position = position - 10;
// the position property in Items[0] is changed, but the change is not reflected in the carouselView
}
}
Класс моей модели:
class Product
{
#region Bindings
//Item views
public string Title { get; set; }
public string Price { get; set; }
public string ImageSrc { get; set; }
public string Description { get; set; }
// Gradient colors
private Color startColor;
public Color StartColor
{
get
{
return startColor;
}
set
{
startColor = value;
}
}
private Color endColor;
public Color EndColor
{
get
{
return endColor;
}
set
{
endColor = value;
}
}
private Color backgroundColor;
public Color BackgroundColor
{
get
{
if (startColor != null && endColor != null)
backgroundColor = GetBackGroundColor();
return backgroundColor;
}
}
//Item Properties
private double _position;
public double Position
{
get
{
return _position;
}
set
{
_position = value;
OnPropertyChanged();
}
}
private double _scale;
public double Scale
{
get { return _scale; }
set
{
_scale = value;
OnPropertyChanged();
}
}
#endregion
public Product()
{
Scale = 1;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
И это все, если вам понадобится больше кода или информации, я предоставлю ее вам как как только я увижу ваш запрос. Спасибо всем за потраченное время, хорошего дня.