如何在Listview上使用ScrollTo方法
我有使用prism的xamarin表单应用程序。我使用的是绑定到如何在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
可观察集合的列表视图
,但是每当列表视图再次打开时,它需要从列表视图滚动到以前选择的项目
有一个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