GridView コントロールを使用してアプリのスタート画面を開発しているときに、問題が発生しました。CollectionViewSource が ItemSource として設定されているメイン画面に GridView があります。
この CollectionViewSource の場合、ソースは ObservableCollection リストに設定されます。各 GroupViewModel には ObservableCollection があります。コードでは、重要な部分は次のようになります。
public class StartPageViewModel : ViewModelBase
{
public ObservableCollection<GroupViewModel> Groups { get; set; }
public CollectionViewSource GroupsCvs { get; set; }
public StartPageViewModel()
{
// fill Groups with some mock data
GroupsCvs.Source = Groups;
GroupsCvs.IsSourceGrouped = true;
}
public void MoveItems(GroupViewModel grp)
{
// add a dummy item
grp.AddRecipe(new ItemViewModel(new Item()) { Id = "123" });
RaisePropertyChanged("GroupsCvs");
RaisePropertyChanged("Groups");
}
}
public class GroupViewModel : ViewModelBase, IEnumerable<ItemViewModel>
{
public ObservableCollection<ItemViewModel> Items { get; set; }
}
View:
public sealed partial class MainPage : LayoutAwarePage
{
private ViewModelLocator locator = new ViewModelLocator();
public MainPage()
{
this.InitializeComponent();
this.DataContext = locator.Main; // returns StartPageViewModel
}
}
XAML part for MainPage, GridView
<GridView ItemsSource="{Binding GroupsCvs.View}" ...
</GridView>
グループのコレクションにアイテムを追加するときに UI を更新するにはどうすればよいですか? 私の StartPageViewModel では、GroupViewModel にダミー項目を追加し、propertychanged を発生させますが、Grid は同じままです。
また、Items コレクションが運もなく変更されたときに、GroupViewModel クラスでプロパティ変更イベントを発生させようとしました。
編集:コメントに書いたように、ソース プロパティを再割り当てして更新することは可能ですが、これにより GridView が再度レンダリングされますが、これは適切ではありません。より良いユーザーエクスペリエンスをもたらすオプションを探しています。