2017-07-11 24 views
0

プリズムを使用したxamarinフォームアプリケーションがあります。 ListViewを使用していますが、これはObservableCollection<string>にバインドされていますが、リストビューが再び開くたびにリストビューから前に選択した項目にスクロールする必要があります。ListviewでScrollToメソッドを使用する方法

ScrollToメソッドがありますが、プリズムを使用して実装する方法はありますか?

この問題で私を助けてください。

<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

あなたは、このリンクを参照することができます。 [https://stackoverflow.com/a/40452064/5293268] – Sunny

答えて

1

は、次のような何か試してみてください:あなたはあなたのXAMLでの動作特性にこれを追加できるようにリソースにEventAggregatorを利用できるようにすると

開始。

public class App : PrismApplication 
{ 
    protected override async void OnInitialized() 
    { 
     Resources.Add("eventAggregator", Container.Resolve<IEventAggregator>()); 
     await NavigationService.NavigateAsync("MainPage"); 
    } 
} 

あなたのObservableCollectionに

public class ScrollToMyModelEvent : PubSubEvent<MyModel> 
{ 
} 

を持つモデルタイプがIEventAggregatorのプロパティと動作を追加とるイベントを作成します。 プロパティはBindableプロパティである必要はなく、実際には観測可能です。本当に必要なのは、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); 
    } 
} 

あなたのViewModelでは、単にイベントを公開するだけで済みます。私がここに示すように、ここで行うことができるのは、あなたが戻るまでナビゲートするときだけです。これは、Behaviorで処理され、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); 
     } 
    } 
} 

は、その後、あなたのビューで

<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

おかげでダンは、ビヘイビアクラスで_AttachBehaviorProperty_の_OnAttachBehaviorChanged_方法は_OnAttachBehaviorChanged_が静的 あるようしかし、私はイベントをサブスクライブすることはできないんだけど、トリガーされます私の行動クラスを見てください。 [リンク](https://gist.github.com/anonymous/eb01517dbec43a0d0ae0d0fcbc73c857) –

+0

行動のリビジョンをご覧ください。あなたはクラス内に静的なものはまったく必要ありません:) –

+0

これはDanさんには、ソリューションと詳細な説明に感謝しています。 –

関連する問題