如何在Listview上使用ScrollTo方法

如何在Listview上使用ScrollTo方法,listview,xamarin,mvvm,xamarin.forms,prism,Listview,Xamarin,Mvvm,Xamarin.forms,Prism,我有使用prism的xamarin表单应用程序。我使用的是绑定到可观察集合的列表视图,但是每当列表视图再次打开时,它需要从列表视图滚动到以前选择的项目 有一个ScrollTo方法,但是我如何使用prism实现它呢 你能帮我解决这个问题吗 <ListView ItemsSource="{Binding obsCommonList}" HasUnevenRows="True" BackgroundColor="Black" SeparatorVisibility="None" Select

我有使用prism的xamarin表单应用程序。我使用的是绑定到
可观察集合的
列表视图
,但是每当列表视图再次打开时,它需要从列表视图滚动到以前选择的项目

有一个ScrollTo方法,但是我如何使用prism实现它呢

你能帮我解决这个问题吗

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


您可以尝试以下方法:

首先在参考资料中提供EventAggregator,以便您可以将其添加到XAML中的行为属性中

public class App : PrismApplication
{
    protected override async void OnInitialized()
    {
        Resources.Add("eventAggregator", Container.Resolve<IEventAggregator>());
        await NavigationService.NavigateAsync("MainPage");
    }
}
公共类应用程序:PrismApplication
{
受保护的重写异步void OnInitialized()
{
Add(“eventAggregator”,Container.Resolve());
等待NavigationService.NavigateAsync(“主页”);
}
}
创建一个事件,该事件采用ObservableCollection中的模型类型

public class ScrollToMyModelEvent : PubSubEvent<MyModel>
{
}
公共类ScrollToMyModelEvent:PubSubEvent { }
为IEventAggregator添加具有属性的行为。注意,您不需要属性是可绑定属性,也不需要属性是真正可观察的。您真正需要的是确保在设置EventAggregator时订阅事件

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);
    }
}
公共类ScrollToMyModelBehavior:BehaviorBase
{
私人事件聚合器;
公共事件聚合器
{
get=>\u事件聚合器;
设置
{
如果(!EqualityComparer.Default.Equals(_eventAggregator,value))
{
_eventAggregator=值;
_eventAggregator.GetEvent().Subscribe(OnScrollToEventPublised);
}
}
}
CrollToEventPublished上的私有无效(MyModel)
{
AssociatedObject.ScrollTo(模型,ScrollToPosition.Start,true);
}
受保护的覆盖无效OnDetachingFrom(ListView可绑定)
{
基础。从(可装订)开始连接;
//事件聚合器使用弱引用,因此忘记了执行此操作
//不应该产生问题,但这是一个更好的做法。
EventAggregator.GetEvent().Unsubscribe(OnScrollToEventPublished);
}
}
在ViewModel中,现在只需发布事件。你可以像我在这里展示的那样,只在导航回视图时才这样做。这将在行为中处理,并将其传递到ListView的ScrollTo方法中

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);
        }
    }
}
公共类MyListPageViewModel:BindableBase,INavigatedAware
{
私有IEventAggregator_事件聚合器{get;}
公共MyListPageViewModel(IEventAggregator事件聚合器)
{
_eventAggregator=eventAggregator;
}
公共ObservableCollection MyModels{get;set;}
公共MyModel SelectedModel{get;set;}
公共void OnNavigatedTo(NavigationParameters)
{
if(parameters.GetNavigationMode()==NavigationMode.Back&&
SelectedModel!=空)
{
_eventAggregator.GetEvent()
.发布(选定模型);
}
}
}
那么在你看来,

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

您可以尝试以下方法:

首先在参考资料中提供EventAggregator,以便您可以将其添加到XAML中的行为属性中

public class App : PrismApplication
{
    protected override async void OnInitialized()
    {
        Resources.Add("eventAggregator", Container.Resolve<IEventAggregator>());
        await NavigationService.NavigateAsync("MainPage");
    }
}
公共类应用程序:PrismApplication
{
受保护的重写异步void OnInitialized()
{
Add(“eventAggregator”,Container.Resolve());
等待NavigationService.NavigateAsync(“主页”);
}
}
创建一个事件,该事件采用ObservableCollection中的模型类型

public class ScrollToMyModelEvent : PubSubEvent<MyModel>
{
}
公共类ScrollToMyModelEvent:PubSubEvent { } 为IEventAggregator添加具有属性的行为。注意,您不需要属性是可绑定属性,也不需要属性是真正可观察的。您真正需要的是确保在设置EventAggregator时订阅事件

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);
    }
}
公共类ScrollToMyModelBehavior:BehaviorBase
{
私人事件聚合器;
公共事件聚合器
{
get=>\u事件聚合器;
设置
{
如果(!EqualityComparer.Default.Equals(_eventAggregator,value))
{
_eventAggregator=值;
_eventAggregator.GetEvent().Subscribe(OnScrollToEventPublised);
}
}
}
CrollToEventPublished上的私有无效(MyModel)
{
AssociatedObject.ScrollTo(模型,ScrollToPosition.Start,true);
}
受保护的覆盖无效OnDetachingFrom(ListView可绑定)
{
基础。从(可装订)开始连接;
//事件聚合器使用弱引用,因此忘记了执行此操作
//不应该产生问题,但这是一个更好的做法。
EventAggregator.GetEvent().Unsubscribe(OnScrollToEventPublished);
}
}
在ViewModel中,现在只需发布事件。你可以像我在这里展示的那样,只在导航回视图时才这样做。这将在行为中处理,并将其传递到ListView的ScrollTo方法中

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);
        }
    }
}
公共类MyListPageViewModel:BindableBase,INavigatedAware
{
私有IEventAggregator_事件聚合器{get;}
公共MyListPageViewModel(IEventAggregator事件聚合器)
{
_eventAggregator=eventAggregator;
}
公共ObservableCollection MyModels{get;set;}
公共MyModel SelectedModel{get;set;}
公共void OnNavigatedTo(NavigationParameters)
{
if(parameters.GetNavigationMode()==NavigationMode.Back&&
SelectedModel!=空)
{
_eventAggregator.GetEvent()
.发布(选定模型);
}
}
}
那么在你看来,

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

您可以参考此链接。[你可以参考这个链接.[谢谢Dan,在t