質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

3382閲覧

Xamarin.Forms ListViewに文字列を追加する度にスクロールさせたい

roamschemer

総合スコア31

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

1クリップ

投稿2018/09/28 06:14

前提・実現したいこと

Xamarin.Formsにて、ボタンを押すとListViewに文字列が追加されるのですが、上限を超えると追加したかわからないので、追加される度にListViewをスクロールさせたい。

該当のソースコード

[View]

XML

1 <StackLayout> 2 <Button Text = "押す" Command="{Binding PushCommand}" /> 3 <ListView ItemsSource="{Binding ActionView}"/> 4 </StackLayout>

[ViewModel]

C#

1 public class MainPageViewModel : ViewModelBase 2 { 3 private Model model = new Model(); 4 public ReadOnlyReactiveCollection<string> ActionView { get; } 5 public ReactiveCommand PushCommand { get; private set; } = new ReactiveCommand(); 6 7 public MainPageViewModel(INavigationService navigationService) 8 : base(navigationService) 9 { 10 this.ActionView = model.ActionView.ToReadOnlyReactiveCollection(); 11 PushCommand.Subscribe(_ => model.Push()); 12 } 13 }

[Model]

C#

1 2 class Model : BindableBase 3 { 4 public ObservableCollection<string> ActionView { get; } = new ObservableCollection<string>(); 5 private int count = 0; 6 public void Push() 7 { 8 count = count + 1; 9 ActionView.Add($"Push{count}"); 10 } 11 } 12

試したこと

ScrollToという物があるらしいとは分かったのですが、どこにどのように書けば良いのかがわかりませんでした。あとViewのコードビハインドには記述しない方向で解決したいです。

補足情報

ReactiveProperty + Prism を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

たまたまそういうのを作成していましたので1例をご紹介します。

コードビハインドを使わないのであれば、VMとやりとりするためのクラスを作成し
そのクラスをバインド可能なプロパティをもったListViewのサブクラスを作成して
それを使うといった方法が考えられます。

具体的にはScrollToを呼ぶためのWrapperを定義し

cs

1public class ScrollController:IScrollController 2 { 3 WeakReference<ListView> _refView; 4 public ScrollController(ListView listView) 5 { 6 _refView = new WeakReference<ListView>(listView); 7 } 8 9 public void ScrollTo(object sourceItem, ScrollToPosition scrollToPosition, bool animated = false) 10 { 11 if(_refView.TryGetTarget(out var listView)){ 12 listView.ScrollTo(sourceItem, scrollToPosition,animated); 13 } 14 } 15 } 16 17public interface IScrollController 18{ 19 void ScrollTo(object sourceItem, ScrollToPosition scrollToPosition, bool animated = false); 20}

これをListViewのサブクラスのプロパティとして定義し
コンストラクタでScrollControllerをセットするようにします。

cs

1public class MyListView:ListView 2{ 3 public MyListView(ListViewCachingStrategy cachingStrategy):base(cachingStrategy){ 4 { 5 ScrollController = new ScrollController(this); 6 } 7 8 public static BindableProperty ScrollControllerProperty = 9 BindableProperty.Create( 10 nameof(ScrollController), 11 typeof(IScrollController), 12 typeof(MyListView), 13 default(IScrollController), 14 defaultBindingMode: BindingMode.OneWayToSource 15 ); 16 17 public IScrollController ScrollController 18 { 19 get { return (IScrollController)GetValue(ScrollControllerProperty); } 20 set { SetValue(ScrollControllerProperty, value); } 21 } 22}

XAMLで以下のようにバインドし

xml

1<local:MyListView ScrollController="{Binding ScrollCtrl}" ... />

VM から以下のように使用します。

cs

1public class MainPageViewModel : ViewModelBase 2{ 3 public IScrollController ScrollCtrl { get;set; } 4 5 public MainPageViewModel(INavigationService navigationService) 6 : base(navigationService) 7 { 8 this.ActionView = model.ActionView.ToReadOnlyReactiveCollection(); 9 PushCommand.Subscribe(_ => { 10 model.Push(); 11 ScrollCtrl.ScrollTo(ActionView.Last(), ScrollToPosition.End, true); 12 }); 13 } 14}

非常にめんどくさいので、正直コードビハインドに書いた方が早いと思います。

投稿2018/09/28 06:45

kamu

総合スコア208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roamschemer

2018/10/01 02:56

やってみましたけど確かに難しいですね…もっと簡単にできるかと思っていました。 コードビハインドに書くようにするか検討してみたいと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問