Vous pouvez essayer quelque chose comme ce qui suit:
Commencez par faire le EventAggregator disponible dans les ressources afin que vous puissiez ajouter à une propriété de comportement dans votre XAML.
public class App : PrismApplication
{
protected override async void OnInitialized()
{
Resources.Add("eventAggregator", Container.Resolve<IEventAggregator>());
await NavigationService.NavigateAsync("MainPage");
}
}
Créer un événement qui prend le type de modèle que vous avez dans votre ObservableCollection
public class ScrollToMyModelEvent : PubSubEvent<MyModel>
{
}
Ajouter un comportement avec une propriété pour la IEventAggregator. REMARQUE Vous n'avez pas besoin que la propriété soit une propriété lisible ou réellement observable. Ce dont vous avez réellement besoin, c'est de vous assurer de vous abonner à l'événement lorsque EventAggregator est défini.
public class ScrollToMyModelBehavior : BehaviorBase<ListView>
{
private IEventAggregator _eventAggregator;
public IEventAggregator EventAggregator
{
get => _eventAggregator;
set
{
if(!EqualityComparer<IEventAggregator>.Default.Equals(_eventAggregator, value))
{
_eventAggregator = value;
_eventAggregator.GetEvent<ScrollToMyModelEvent>().Subscribe(OnScrollToEventPublished);
}
}
}
private void OnScrollToEventPublished(MyModel model)
{
AssociatedObject.ScrollTo(model, ScrollToPosition.Start, true);
}
protected override void OnDetachingFrom(ListView bindable)
{
base.OnDetachingFrom(bindable);
// The Event Aggregator uses weak references so forgetting to do this
// shouldn't create a problem, but it is a better practice.
EventAggregator.GetEvent<ScrollToMyModelEvent>().Unsubscribe(OnScrollToEventPublished);
}
}
Dans votre ViewModel, il vous suffit maintenant de publier l'événement. Vous pouvez faire ce que je montre ici où vous ne faites cela que lorsque vous revenez à la vue. Cela sera ensuite géré dans le comportement et le passera dans la méthode ScrollTo de ListView.
public class MyListPageViewModel : BindableBase, INavigatedAware
{
private IEventAggregator _eventAggregator { get; }
public MyListPageViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}
public ObservableCollection<MyModel> MyModels { get; set; }
public MyModel SelectedModel { get; set; }
public void OnNavigatedTo(NavigationParameters)
{
if(parameters.GetNavigationMode() == NavigationMode.Back &&
SelectedModel != null)
{
_eventAggregator.GetEvent<ScrollToMyModelEvent>()
.Publish(SelectedModel);
}
}
}
Ensuite, dans votre vue
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:behavior="clr-namespace:AwesomeApp.Behaviors"
x:Class="AwesomeApp.ScrollToPage">
<ListView>
<ListView.Behaviors>
<behavior:ScrollToMyModelBehavior EventAggregator="{StaticResource eventAggregator}" />
</ListView.Behaviors>
</ListView>
</ContentPage>
Vous pouvez consulter ce lien. [https://stackoverflow.com/a/40452064/5293268] – Sunny