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

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

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

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

MVVM

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

Xamarin

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

解決済

【C#】【MVVM】非同期でObservableCollectionに追加したデータをViewに反映させる方法が知りたい

OXamarin
OXamarin

総合スコア0

C#

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

MVVM

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

Xamarin

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

4回答

0評価

0クリップ

6599閲覧

投稿2017/07/09 11:01

###前提・実現したいこと
取得したツイートをViewにバインドしたい

###発生している問題
2点あります。

・1点目
ViewModelのコンストラクタ内で初期表示するツイートを取得しています。
Timelineプロパティの値をViewにバインディングさせています。
このプロパティはObservableCollectionなので、Addされたタイミングで変更通知がいっていると思いますが実際には何もバインドされません。

・2点目
コンストラクタの中で実行している Task.Run内の処理がawaitしているにも関わらずにすぐに処理が通り抜けた後に await内の処理が実行されています。なぜこのような動作になってしまうのでしょうか。

##Code (ViewModel)

C#

public class MainPageViewModel : BindableBase { #region プロパティ public ObservableCollection<string> TweetList { get; set; } public ObservableCollection<long> UserListIds { get; set; } public ObservableCollection<Timeline> Timeline { get; set; } #endregion #region フィールド private Tweet _tweet = new Tweet(); #endregion #region コンストラクタ public MainPageViewModel() { Task.Run(async () => { await _tweet.GetListIdsAsync("ユーザ名"); UserListIds = _tweet.UserListIds; await _tweet.GetListTimelineAsync(UserListIds.Skip(2).First()); Timeline = _tweet.Timeline; }); } #endregion }

##Code (View)

xaml

<ListView ItemsSource="{Binding Timeline}" RowHeight="80"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid> <Grid.RowDefinitions> <RowDefinition Height="10" /> <RowDefinition Height="20" /> <RowDefinition Height="40" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="50" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="50" /> </Grid.ColumnDefinitions> <!--トーク相手の画像--> <Image Source="{Binding ProfileImage}" Grid.RowSpan="3" /> <!--トーク相手の名前--> <Label Grid.Row="1" Grid.Column="1" Text="{Binding Name}" FontAttributes="Bold" /> <!--最終トーク内容--> <Label Grid.Row="2" Grid.Column="1" Text="{Binding Text}" FontSize="12" /> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView>

###試したこと
・Twitter APIからデータを取得するメソッドを同期的にして試してみましたが、対応していないのか例外で落ちてしまいます。
・コンストラクタ内でTimelineプロパティに対してAddをしてみると画面に反映されました。

###GitHub
全体のコードを以下のGitHubにアップロードしています。
https://github.com/karimatan1106/XamarinTweetForList

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

MVVM

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

Xamarin

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