private void StartDrag(ListBoxItem listBoxItem, MouseEventArgs e)
        {
            isDragging = true;
            try
            {
                if (listBoxItem != null)
                {
                    // Find the data behind the ListBoxItem
                    ICharacterOption option = (ICharacterOption)listBoxItem.DataContext;
                    int sourceIndex         = optionListBox.Items.IndexOf(option);

                    // Initialize the drag & drop operation
                    DataObject dragData = new DataObject(Constants.OPTION_DRAG_KEY, new Tuple <IOptionGroupViewModel, int, ICharacterOption>(this.viewModel, sourceIndex, option));
                    DragDrop.DoDragDrop(listBoxItem, dragData, DragDropEffects.Move);
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                isDragging = false;
                dataItem   = null;
            }
        }
        private void RemoveOption(ICharacterOption option)
        {
            T optionToRemove = (T)option;

            if (optionGroup.Contains(optionToRemove))
            {
                optionGroup.Remove(optionToRemove);
            }
        }
        public static object GetCurrentSelectedOptionInOptionGroup(Object lb)
        {
            ICharacterOption option  = null;
            ListBox          listBox = lb as ListBox;

            if (listBox != null && listBox.SelectedItem != null)
            {
                if (listBox.SelectedItem is ICharacterOption)
                {
                    option = listBox.SelectedItem as ICharacterOption;
                }
            }

            return(option);
        }
        public void InsertOption(int index, ICharacterOption characterOption)
        {
            OptionGroup <T> group         = (optionGroup as OptionGroup <T>);
            var             existingIndex = group.IndexOf((T)characterOption);

            if (existingIndex >= 0)
            {
                group.RemoveAt(existingIndex);
                if (index > 0 && index >= group.Count)
                {
                    index -= 1;
                }
            }
            group.Insert(index, (T)characterOption);
        }
        private void GroupBox_PreviewDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(Constants.OPTION_DRAG_KEY))
            {
                expanderExpandedForDrop = false;
                GroupBox groupBox = (GroupBox)sender;
                Tuple <IOptionGroupViewModel, int, ICharacterOption> dragDropDataTuple = e.Data.GetData(Constants.OPTION_DRAG_KEY) as Tuple <IOptionGroupViewModel, int, ICharacterOption>;
                if (dragDropDataTuple != null)
                {
                    IOptionGroupViewModel sourceViewModel = dragDropDataTuple.Item1;
                    int sourceIndex         = dragDropDataTuple.Item2;
                    ICharacterOption option = dragDropDataTuple.Item3;
                    if (this.viewModel.OptionGroup.Type == OptionType.Mixed && sourceViewModel.OptionGroup.Type != OptionType.Mixed) // do a copy paste
                    {
                        sourceIndex = -1;
                    }
                    int targetIndex = 0;

                    ListBoxItem listBoxItem;
                    FindDropTarget(groupBox, out listBoxItem, e);
                    if (listBoxItem != null)
                    {
                        ICharacterOption target = listBoxItem.DataContext as ICharacterOption;
                        if (dragDropDataTuple != null && target != null)
                        {
                            targetIndex = optionListBox.Items.IndexOf(target);
                        }
                    }
                    else
                    {
                        targetIndex = optionListBox.Items != null ? optionListBox.Items.Count : 0; // append to last of current option group
                        if (sourceIndex >= 0 && this.viewModel == sourceViewModel)                 // an item will be removed from the current option group, so reduce target index by 1
                        {
                            targetIndex -= 1;
                        }
                    }
                    if (sourceViewModel != null && sourceIndex >= 0)
                    {
                        sourceViewModel.RemoveOption(sourceIndex);
                    }
                    this.viewModel.InsertOption(targetIndex, option);
                    this.viewModel.SaveOptionGroup();
                }
            }
        }