底辺SE奮闘記

年収300万SEブログ

【Xamarin・Fody】List<T>の更新が反映されない

表題の通りです。

環境

  • iOS12.1.4
  • VisualStudio for Mac 8.3.8
  • Xamarin.Forms 4.2.0.848062
  • PropertyChanged.Fody 3.1.3

問題のあるコード

XMLファイル

<!-- 省略 -->
<Picker ItemsSource="{Binding Items}" ItemDisplayBinding="{Binding Name}"/>
<!-- 省略 -->

コンテンツページクラス

using Xamarin.Forms;
using MyApp.Model;

namespace MyApp.Pages
{
    public partial class MyPage : ContentPage
    {
        MyModel model;

        public MyPage()
        {
            InitializeComponent();
            model = new MyModel();
            BindingContext = model;
            model.update();
        }
    }
}

モデル

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace MyApp.Model
{
    public class MyModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public class PickerItems
        {
            public string Name { get; set; }
        }
        public List<PickerItems> Items { get; set; }

        public MyModel()
        {
            Items = new List<PickerItems>();
            Items.Add(new PickerItems() { Name = "1号" });
        }
        
        public function void update()
        {
            Items.Add(new PickerItems() { Name = "2号" });
        }
    }
}

上記コードでは、「1号」は追加されますが、「2号」が追加されません。

List<T>ではなくObservableCollection<T>を使用します。

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace MyApp.Model
{
    public class MyModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public class PickerItems
        {
            public string Name { get; set; }
        }
        public ObservableCollection<PickerItems> Items { get; set; }

        public MyModel()
        {
            Items = new ObservableCollection<PickerItems>();
            Items.Add(new PickerItems() { Name = "1号改" });
        }
        
        public function void update()
        {
            Items.Add(new PickerItems() { Name = "2号改" });
        }
    }
}