Sie könnten so etwas wie die folgenden versuchen:
Start in den Ressourcen der Eventaggregator zur Verfügung mit der Herstellung, so dass Sie diese zu einem Verhalten Eigenschaft in XAML hinzufügen können.
public class App : PrismApplication
{
protected override async void OnInitialized()
{
Resources.Add("eventAggregator", Container.Resolve<IEventAggregator>());
await NavigationService.NavigateAsync("MainPage");
}
}
ein Ereignis, das den Modelltyp nimmt, die Sie in Ihrem ObservableCollection
public class ScrollToMyModelEvent : PubSubEvent<MyModel>
{
}
hinzufügen Verhalten mit einer Eigenschaft für den IEventAggregator haben. HINWEIS Sie brauchen die Eigenschaft nicht als bindbare Eigenschaft oder wirklich beobachtbar. Was Sie wirklich brauchen, ist sicherzustellen, dass Sie das Ereignis abonnieren, wenn der EventAggregator eingestellt ist.
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);
}
}
In Ihrem ViewModel müssen Sie das Ereignis jetzt einfach veröffentlichen. Sie können tun, was ich hier zeige, wo Sie dies nur tun, wenn Sie Zurück zur Ansicht navigieren. Dies würde dann im Behavior behandelt und an die ScrollTo-Methode der ListView übergeben.
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);
}
}
}
Dann in Ihrer Ansicht
<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>
können Sie diesen Link verweisen. [https://stackoverflow.com/a/40452064/5293268] – Sunny