Ejemplo n.º 1
0
        // 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;
            }
        }
Ejemplo n.º 2
0
        // 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;
            }
        }