###前提・実現したいこと
取得したツイートをViewにバインドしたい
###発生している問題
2点あります。
・1点目
ViewModelのコンストラクタ内で初期表示するツイートを取得しています。
Timelineプロパティの値をViewにバインディングさせています。
このプロパティはObservableCollectionなので、Addされたタイミングで変更通知がいっていると思いますが実際には何もバインドされません。
・2点目
コンストラクタの中で実行している Task.Run内の処理がawaitしているにも関わらずにすぐに処理が通り抜けた後に await内の処理が実行されています。なぜこのような動作になってしまうのでしょうか。
##Code (ViewModel)
C#
1public class MainPageViewModel : BindableBase 2{ 3 #region プロパティ 4 public ObservableCollection<string> TweetList { get; set; } 5 public ObservableCollection<long> UserListIds { get; set; } 6 public ObservableCollection<Timeline> Timeline { get; set; } 7 #endregion 8 9 #region フィールド 10 private Tweet _tweet = new Tweet(); 11 #endregion 12 13 #region コンストラクタ 14 public MainPageViewModel() 15 { 16 Task.Run(async () => 17 { 18 await _tweet.GetListIdsAsync("ユーザ名"); 19 UserListIds = _tweet.UserListIds; 20 await _tweet.GetListTimelineAsync(UserListIds.Skip(2).First()); 21 Timeline = _tweet.Timeline; 22 }); 23 } 24 #endregion 25}
##Code (View)
xaml
1<ListView ItemsSource="{Binding Timeline}" 2 RowHeight="80"> 3 <ListView.ItemTemplate> 4 <DataTemplate> 5 <ViewCell> 6 <Grid> 7 <Grid.RowDefinitions> 8 <RowDefinition Height="10" /> 9 <RowDefinition Height="20" /> 10 <RowDefinition Height="40" /> 11 </Grid.RowDefinitions> 12 <Grid.ColumnDefinitions> 13 <ColumnDefinition Width="50" /> 14 <ColumnDefinition Width="*" /> 15 <ColumnDefinition Width="50" /> 16 </Grid.ColumnDefinitions> 17 18 <!--トーク相手の画像--> 19 <Image Source="{Binding ProfileImage}" 20 Grid.RowSpan="3" 21 /> 22 <!--トーク相手の名前--> 23 <Label Grid.Row="1" Grid.Column="1" 24 Text="{Binding Name}" 25 FontAttributes="Bold" 26 /> 27 <!--最終トーク内容--> 28 <Label Grid.Row="2" Grid.Column="1" 29 Text="{Binding Text}" 30 FontSize="12" 31 /> 32 </Grid> 33 </ViewCell> 34 </DataTemplate> 35 </ListView.ItemTemplate> 36</ListView> 37
###試したこと
・Twitter APIからデータを取得するメソッドを同期的にして試してみましたが、対応していないのか例外で落ちてしまいます。
・コンストラクタ内でTimelineプロパティに対してAddをしてみると画面に反映されました。
###GitHub
全体のコードを以下のGitHubにアップロードしています。
https://github.com/karimatan1106/XamarinTweetForList
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。