表題の通りです。
環境
- 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号改" }); } } }