// VM側からの変更通知 private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { var vmList = MultiSelectorAtt.GetSelectedItems(AssociatedObject); if (vmList == null) { return; } if (IsUpdating) { return; } try { IsUpdating = true; System.Diagnostics.Debug.WriteLine("MultiSelectorSelectedItemsHandler.CollectionChanged"); switch (e.Action) { case NotifyCollectionChangedAction.Add: foreach (var item in e.NewItems) { var insertingItem = item; if (insertingItem == null) { // nullはNewItemPlaceHolderとして扱う insertingItem = CollectionView.NewItemPlaceholder; } // 遅そう if (!AssociatedObject.SelectedItems.Contains(insertingItem)) { AssociatedObject.SelectedItems.Add(insertingItem); } } break; case NotifyCollectionChangedAction.Remove: foreach (var item in e.OldItems) { AssociatedObject.SelectedItems.Remove(item); } break; case NotifyCollectionChangedAction.Reset: AssociatedObject.SelectedItems.Clear(); break; default: break; } } finally { IsUpdating = false; } }
// V側からの変更通知 private void SelectionChanged(object sender, SelectionChangedEventArgs e) { var vmList = MultiSelectorAtt.GetSelectedItems(AssociatedObject); if (vmList == null) { return; } if (IsUpdating) { return; } try { IsUpdating = true; System.Diagnostics.Debug.WriteLine("MultiSelectorSelectedItemsHandler.SelectionChanged start"); foreach (var item in e.RemovedItems) { vmList.Remove(item); } foreach (var item in e.AddedItems) { object insertingItem = item; // うーん... if (insertingItem == CollectionView.NewItemPlaceholder) { var ilist = vmList.GetType().GetInterface(typeof(IList <>).FullName); if (ilist == null) { // IList<T> を実装していないので何でも突っ込める } else { // IList<T> を実装しているのでその型しか突っ込めない var elementType = ilist.GenericTypeArguments[0]; if (elementType.IsAssignableFrom(item.GetType())) { // 互換性があるっぽい なんで? } else { // 型が合わないのでitemの代わりにnullを突っ込む insertingItem = null; } } } // 遅そう if (!vmList.Contains(insertingItem)) { vmList.Add(insertingItem); } } System.Diagnostics.Debug.WriteLine("MultiSelectorSelectedItemsHandler.SelectionChanged finish"); } finally { IsUpdating = false; } }