2017-07-11 1 views
0

Ich habe Xamarin Formen App, die Prisma verwendet. Ich benutze eine ListView, die an eine ObservableCollection<string> gebunden ist, aber immer wenn die ListView erneut geöffnet wird, muss sie zum zuvor ausgewählten Element in der Listview blättern.So verwenden Sie ScrollTo-Methode für eine Listview

Es gibt eine Methode ScrollTo aber wie würde ich es mit Prisma implementieren?

Könnten Sie mir bitte mit diesem Problem helfen?

<ListView ItemsSource="{Binding obsCommonList}" HasUnevenRows="True" BackgroundColor="Black" SeparatorVisibility="None" SelectedItem="{Binding SelectedProp,Mode=TwoWay}"> 
     <ListView.Behaviors> 
      <b:EventToCommandBehavior EventName="ItemTapped" Command="{Binding ItemTappedCommand}" EventArgsParameterPath="Item"/> 
     </ListView.Behaviors> 

+0

können Sie diesen Link verweisen. [https://stackoverflow.com/a/40452064/5293268] – Sunny

Antwort

1

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> 
+0

Dank Dan, in der Verhaltensklasse der _OnAttachBehaviorChanged_ Methode des _AttachBehaviorProperty_ gefeuert wird, aber ich nicht in der Lage bin zu der Veranstaltung als _OnAttachBehaviorChanged_ abonniert statisch Können Sie bitte einen Blick auf meine Verhaltensklasse werfen: [link] (https://gist.github.com/anonymous/eb01517dbec43a0d0ae0d0fcbc73c857) –

+0

Bitte beachten Sie die Überarbeitung des Verhaltens. Du brauchst überhaupt nichts Statisches in der Klasse :) –

+0

Das funktioniert Dan, vielen Dank für die Lösung und detaillierte Erklärung. –

Verwandte Themen