ListViewのItemSourceに設定した値をプログラム的に変更してもUIに反映されないとき

概要

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クラスがそういう仕様なのでしょうか・・・。
でも解決策が見つかってとっても嬉しいです。