This is a migrated thread and some comments may be shown as answers.

How to find the RadlistBoxItem index on which is dropped

7 Answers 143 Views
DragAndDrop
This is a migrated thread and some comments may be shown as answers.
Asuman
Top achievements
Rank 1
Asuman asked on 27 Jul 2015, 07:52 AM

Hi eveyone,

I think it may be so easy but I don't know how to find the RadlistBoxItem index on which is dropped (DropPosition) in RadListBox before adding the item to destination RadListBox.ItemsSource using DragDropBehavior.

Thank you.

7 Answers, 1 is accepted

Sort by
0
Nasko
Telerik team
answered on 28 Jul 2015, 11:23 AM
Hi Asuman,

One possible approach to achieve the desired is to create a custom ListBoxDragDropBehavior and override its Drop method. Inside it you could access the InsertIndex from the DragDropState:
public class CustomListBoxDragDropBehavior : ListBoxDragDropBehavior
{
    public override void Drop(DragDropState state)
    {
        var index = state.InsertIndex;
        base.Drop(state);
    }
}

and in Xaml:
<telerik:RadListBox >
    <telerik:RadListBox.DragDropBehavior>
        <local:CustomListBoxDragDropBehavior />
    </telerik:RadListBox.DragDropBehavior>
</telerik:RadListBox>

Please, give it a try and let us know if the proposed approach helped you for your scenario.

We hope this will help you.

Regards,
Nasko
Telerik
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
0
Asuman
Top achievements
Rank 1
answered on 28 Jul 2015, 12:38 PM

Hi Nasko,

Thank you for your reply. I'm trying to develop an object similar to RadFieldList querying directly from database. So, as you know, I have to manage 5 listboxes. I couldn't find how to be able to manage them by overriding ListBoxDragDropBehavior's methods. Because I can not access to listboxes via these methods to check if the item is there. So I've decided to manipulate drag and drop operations (including drop prevention) through DragDropManager. If you have a similar sample for this purpose I would apriciate you for sharing with me.

 

Thank you...

0
Asuman
Top achievements
Rank 1
answered on 28 Jul 2015, 05:01 PM
Sory, I correct RadFieldList as RadPivotGridFieldList...
0
Nasko
Telerik team
answered on 31 Jul 2015, 07:33 AM
Hi Asuman,

Could you please share with us your custom implementation of the DragDrop behavior of the ListBoxes that you create using the DragDropManager

Meanwhile, as another approach that we could suggest you is to handle the CollectionChanged event of the collection your ListBox is bound to. Thus as soon as an item is dropped inside the collection the vent will fire and you will be able to get its index.

We are looking forward to hearing from you.

Regards,
Nasko
Telerik
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
0
Asuman
Top achievements
Rank 1
answered on 03 Aug 2015, 07:11 AM

Hi Nasko,

Thank you for your quick reply. DragDropManager ​made me manipulate all scenarios. Especially it's so difficult to handle drag drop position values in RadWindow object. So I've choiced your advice. Now my app sample is like this.

 

public class FieldX
    {
        public int FieldID { get; set; }
        public string FieldName { get; set; }

        public FieldX Clone()
        {
            return new FieldX
            {
                FieldID = this.FieldID,
                FieldName = this.FieldName,
            };
        }
    }

 

<DataTemplate x:Key="ListBoxItemTemplate">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <Grid Grid.Column="0">
                        <telerik:RadButton Width="15" Height="20" IsBackgroundVisible="False" Margin="5,0" Click="RadButton_Click">
                            <ToolTipService.ToolTip>
                                <ToolTip Style="{StaticResource TooltipStyle}" >
                                    <TextBlock Text="Filtre ve Rumuz bilgilerini belirlemek için tıklayın..." FontSize="13"/>
                                </ToolTip>
                            </ToolTipService.ToolTip>

                            <Polygon Points="1,3 6,3 3.5,7" Stroke="Gray" StrokeThickness="2" Fill="Black" VerticalAlignment="Center" />
                        </telerik:RadButton>
                    </Grid>

                    <TextBlock Text="{Binding FieldName}" Style="{StaticResource ListBoxItemTextBlockStyle}" Grid.Column="1" />
                </Grid>
            </DataTemplate>

 ​

<telerik:RadListBox x:Name="lbFields"
                                AllowDrop="True" Grid.Row="1"
                                ItemTemplate="{StaticResource ListBoxItemTemplate}"
                                ddBehaviors:CustomDragDropBehavior.IsEnabled="True" >
                <telerik:RadListBox.DragDropBehavior>
                    <ddBehaviors:CustomDragDropBehavior />
                </telerik:RadListBox.DragDropBehavior>
</telerik:RadListBox>​

 

    public class CustomDragDropBehavior : ListBoxDragDropBehavior
    {
        public static bool GetIsEnabled(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsEnabledProperty);
        }

        public static void SetIsEnabled(DependencyObject obj, bool value)
        {
            obj.SetValue(IsEnabledProperty, value);
        }

        // Using a DependencyProperty as the backing store for IsEnabled.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IsEnabledProperty =
            DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(ListBoxDragDropBehavior),
                new PropertyMetadata(new PropertyChangedCallback(OnIsEnabledPropertyChanged)));

        public static void OnIsEnabledPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
        {
            SetIsEnabled(dependencyObject, (bool)e.NewValue);

            RadListBox listBox = (RadListBox)dependencyObject; ;

            if (listBox.Name.Equals("lbFields")) ListBoxFields = listBox;
            if (listBox.Name.Equals("lbFilters")) ListBoxFilters = listBox;
            if (listBox.Name.Equals("lbRows")) ListBoxRows = listBox;
            if (listBox.Name.Equals("lbColumns")) ListBoxColumns = listBox;
            if (listBox.Name.Equals("lbValues")) ListBoxValues = listBox;
        }

        static RadListBox ListBoxFields;
        static RadListBox ListBoxFilters;
        static RadListBox ListBoxRows;
        static RadListBox ListBoxColumns;
        static RadListBox ListBoxValues;

        public override void Drop(DragDropState state)
        {
            var insertIndex = state.InsertIndex; // -1 means that the items should be added at the end of the items source.
            var allListBoxes = new List<RadListBox> { ListBoxFields, ListBoxFilters, ListBoxRows, ListBoxColumns, ListBoxValues };
            var tripleListBoxes = new List<RadListBox> { ListBoxFilters, ListBoxRows, ListBoxColumns };

            foreach (object item in state.DraggedItems)
            {
                var sourceListBox = allListBoxes
                    .Where(l => ((IList)l.ItemsSource).Contains(item))
                    .FirstOrDefault<RadListBox>();

                var targetListBox = allListBoxes
                    .Where(l => l.ItemsSource == state.DestinationItemsSource)
                    .FirstOrDefault<RadListBox>();

                if (sourceListBox == ListBoxFields)
                {
                    if (insertIndex == -1) insertIndex = state.DestinationItemsSource.Count;

                    if (tripleListBoxes.Contains(targetListBox))
                    {
                        foreach(var lstBox in tripleListBoxes)
                        {
                            var source = (ObservableCollection<FieldX>)lstBox.ItemsSource;
                            source.Where(a => a.FieldID == ((FieldX)item).FieldID)
                                .ToList().ForEach(a => source.Remove(a));
                        }

                        state.DestinationItemsSource.Insert(insertIndex, ((FieldX)item).Clone());
                    }
                    else if (targetListBox == ListBoxValues)
                    {
                        //state.DestinationItemsSource.Insert(insertIndex, ......);
                    }
                }
                else if (tripleListBoxes.Contains(sourceListBox))
                {
                    ((IList)sourceListBox.ItemsSource).Remove(item);
                    if (insertIndex == -1) insertIndex = state.DestinationItemsSource.Count;

                    if (tripleListBoxes.Contains(targetListBox))
                    {
                        state.DestinationItemsSource.Insert(insertIndex, ((FieldX)item).Clone());
                    }
                    else if (targetListBox == ListBoxValues)
                    {
                        //state.DestinationItemsSource.Insert(insertIndex, ......);
                    }
                }
                else if (sourceListBox == ListBoxValues)
                {
                    ((IList)sourceListBox.ItemsSource).Remove(item);
                    if (insertIndex == -1) insertIndex = state.DestinationItemsSource.Count;

                    if (tripleListBoxes.Contains(targetListBox))
                    {
                        //state.DestinationItemsSource.Insert(insertIndex, ......);
                    }
                    else if (targetListBox == ListBoxValues)
                    {
                        state.DestinationItemsSource.Insert(insertIndex, ((FieldX)item).Clone());
                    }

                    //base.Drop(state);
                }
            }
        }

        public override void DragDropCompleted(DragDropState state)
        {
         }
    }

I feel that this is not effective way that I try to go.

 

Best regards.

 

0
Asuman
Top achievements
Rank 1
answered on 04 Aug 2015, 09:07 AM

Hi Nasko,

My main purpose is viewing data from DB, not local datasource. Is it possible to use RadPivotFieldList withoutout data (at the beginning) to define which fields and with which filter values  to select from database and after getting data to local binding it to LocalDataSourceProvider?

Best regards
0
Accepted
Nasko
Telerik team
answered on 05 Aug 2015, 12:50 PM
Hello Asuman,

You could achieve the desired by you functionality. For that purpose you need first to create a ViewModel class and inside it you need to define your date provide. Please, notice that the Data Provider is not a visual element and if your are using the MVVM pattern for your application the provider won't break it. Finally you can bind RadPivotGrid's DataProvider (the same is valid also for the DataProvider of the RadPivotFieldList) to the provider in your ViewModel.

Please, check the attached sample project that demonstrates the described above approach.

We hope this will help you.

Regards,
Nasko
Telerik
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
Tags
DragAndDrop
Asked by
Asuman
Top achievements
Rank 1
Answers by
Nasko
Telerik team
Asuman
Top achievements
Rank 1
Share this question
or