概要
UWPのListViewのItemSourceにバインドした値をプログラム的に変更したけど、UIでは何も表示が変わってくれなかった時の対応について。
エラー発生時の状況
・XAML
5行目のItemSourceのところで、プログラム的に変更したい変数とバインドしています。 プログラムからしか変更しないので、ModeはOneWayにしています。
<ListView x:Name="ActivityLogArea" Height="300" HorizontalAlignment="Stretch" ItemsSource="{x:Bind ViewModel.ActivityLog, Mode=OneWay}"> <ListView.ItemTemplate> <DataTemplate x:Name="ActivityLogTemplate" x:DataType="data:Activity"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="15" /> <RowDefinition Height="15" /> </Grid.RowDefinitions> <RelativePanel Grid.Row="0"> <TextBlock x:Name="prefix" Grid.Row="0" HorizontalAlignment="Right" FontSize="12" Text="[ " /> <TextBlock x:Name="Start" Grid.Row="0" HorizontalAlignment="Center" FontSize="12" RelativePanel.RightOf="prefix" Text="{x:Bind StartTime}" /> <TextBlock x:Name="hyphen" Grid.Row="0" HorizontalAlignment="Center" FontSize="10" RelativePanel.RightOf="Start" Text=" - " /> <TextBlock x:Name="Stop" Grid.Row="0" HorizontalAlignment="Center" FontSize="12" RelativePanel.RightOf="hyphen" Text="{x:Bind StopTime}" /> <TextBlock x:Name="Postfix" Grid.Row="0" HorizontalAlignment="Left" FontSize="12" RelativePanel.RightOf="Stop" Text=" ]" /> </RelativePanel> <TextBlock Grid.Row="1" FontSize="12" Text="{x:Bind TaskContent}" /> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView>
・変数ActivityLogの定義
public ObservableCollection<Activity> ActivityLog { get; set; } = new ObservableCollection<Activity>();
問題のあったソース
僕の作りかけのソースから余分な要素を取り除いているのですが、要はXAMLファイルにおいてバインディングしている変数ActivityLogに対し、ObservableCollection<Activity>型のデータを突っ込んで(上書きして)います。
ActivityLog = new ObservableCollection<Activity>();
問題がなかったソース
問題がなかったほうでは、変数ActivityLogの中身を一旦クリアしたうえで、Addメソッドで要素を追加しなおしています。
ActivityLog.Clear(); (【List<Activity>型のデータ】).ForEach(activity => ActivityLog.Add(activity));
所感
いろいろ試す中たまたまできたため、理由は説明できません・・・。
ObservableCollection
でも解決策が見つかってとっても嬉しいです。