0

e have a requirement to show vertical profiles of Data related to an entity, the profiles can change dynamically, so basically its a dynamic column grid, just that its not a Grid control, instead i have acheived this using ItemsControl and Listboxes.

Now i need to implement something similar to how the Grid behaves in column moving, i have to be able to move the Profile 6 next to Profile 1 to compare.

How can i achieve this ?

Below is my Xaml that renders the screen as shown below the code.

Header buttons are toggle buttons, so clicking on it selects the whole profile.

Updated Code with Drag and Drop

<ScrollViewer Height="500" Name="scrollViewer1" Width="Auto" HorizontalAlignment="Stretch" 
                      VerticalAlignment="Top" Margin="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">

                <toolkit:DockPanel>
                    <!-- Items control container to hold time Bucket information -->
                    <ItemsControl x:Name="TimeBucket" Grid.Column="0" toolkit:DockPanel.Dock="Left" VerticalAlignment="Top">
                        <Grid HorizontalAlignment="Left">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="30" />
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>

                            <ToggleButton Grid.Row="0" Content="Bucket" Width="Auto" HorizontalAlignment="Stretch" IsEnabled="False"/>
                            <ListBox Grid.Row="1" Width="Auto" ItemsSource="{Binding Source={StaticResource DC1}, Path=Content.TimeBuckets, Mode=TwoWay}" 
                                 IsEnabled="False">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <TextBox Text="{Binding}" Style="{StaticResource BucketProfileStyle}" />
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Vertical"  VerticalAlignment="Top"  HorizontalAlignment="Stretch">
                                        </StackPanel>
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                            </ListBox>
                        </Grid>
                    </ItemsControl>

                    <!-- Items Control for dynamic profile columns creation -->
                <toolkit:ListBoxDragDropTarget AllowDrop="True" AllowedSourceEffects="Move" toolkit:DockPanel.Dock="Left" BorderThickness="0" Padding="0" VerticalAlignment="Top">
                    <ListBox ItemsSource="{Binding Profiles}" VerticalAlignment="Top" toolkit:DockPanel.Dock="Left" BorderThickness="0" Padding="0" IsTabStop="True" TabNavigation="Cycle">
                        <!--<ItemsControl x:Name="Profile" ItemsSource="{Binding Profiles}" VerticalAlignment="Top" toolkit:DockPanel.Dock="Left" Drop="Profile_Drop" >-->
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel  Orientation="Horizontal" Drop="StackPanel_Drop" Margin="0"/>
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
                        <ListBox.ItemContainerStyle>
                            <Style TargetType="ListBoxItem">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="ListBoxItem">
                                            <ContentPresenter/>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </ListBox.ItemContainerStyle>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid HorizontalAlignment="Left">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="30" />
                                        <RowDefinition Height="*"/>
                                    </Grid.RowDefinitions>

                                    <ToggleButton Grid.Row="0" x:Name="HeaderButton" Content="{Binding Name}" Tag="{Binding ID}"
                                        Width="Auto" HorizontalAlignment="Stretch" ClickMode="Release">
                                        <i:Interaction.Behaviors>
                                            <b:ToggleButtonAsHeaderButtonItemClickBehavior Command="{Binding Source={StaticResource DC1}, Path=Content.HeaderButtonClickCommand}"/>
                                        </i:Interaction.Behaviors>

                                        <ig:ContextMenuService.Manager>
                                            <!--If you use the Infragistics Commanding Framework, you should set the OpenMode property to None-->
                                            <ig:ContextMenuManager ModifierKeys="None" OpenMode="RightClick">
                                                <ig:ContextMenuManager.ContextMenu>
                                                    <ig:XamContextMenu   HorizontalAlignment="Left" Name="xamContextMenu11" VerticalAlignment="Top">
                                                        <ig:XamMenuItem Header="Import" IsEnabled="{Binding Source={StaticResource DC1}, Path=Content.ImportMenuIsEnabled}">
                                                            <i:Interaction.Triggers>
                                                                <i:EventTrigger EventName="Click">
                                                                    <i:InvokeCommandAction Command="{Binding Source={StaticResource DC1}, Path=Content.ImportMenuCommand}"
                                                           CommandParameter="IMPORT"/>
                                                                </i:EventTrigger>
                                                            </i:Interaction.Triggers>
                                                        </ig:XamMenuItem>
                                                        <ig:XamMenuItem Header="Export" IsEnabled="{Binding Source={StaticResource DC1}, Path=Content.ExportMenuIsEnabled}">
                                                            <i:Interaction.Triggers>
                                                                <i:EventTrigger EventName="Click">
                                                                    <i:InvokeCommandAction Command="{Binding Source={StaticResource DC1}, Path=Content.ExportMenuCommand}"
                                                           CommandParameter="EXPORT"/>
                                                                </i:EventTrigger>
                                                            </i:Interaction.Triggers>
                                                        </ig:XamMenuItem>
                                                        <ig:XamMenuItem Header="Revert to Original" IsEnabled="{Binding Source={StaticResource DC1}, Path=Content.RevertMenuIsEnabled}">
                                                            <i:Interaction.Triggers>
                                                                <i:EventTrigger EventName="Click">
                                                                    <i:InvokeCommandAction Command="{Binding Source={StaticResource DC1}, Path=Content.RevertMenuCommand}"
                                                           CommandParameter="REVERT"/>
                                                                </i:EventTrigger>
                                                            </i:Interaction.Triggers>
                                                        </ig:XamMenuItem>
                                                        <ig:XamMenuItem Header="Graph" IsEnabled="{Binding Source={StaticResource DC1}, Path=Content.GraphMenuIsEnabled}">
                                                            <i:Interaction.Triggers>
                                                                <i:EventTrigger EventName="Click">
                                                                    <i:InvokeCommandAction Command="{Binding Source={StaticResource DC1}, Path=Content.GraphMenuCommand}"
                                                           CommandParameter="GRAPH"/>
                                                                </i:EventTrigger>
                                                            </i:Interaction.Triggers>
                                                        </ig:XamMenuItem>
                                                    </ig:XamContextMenu>
                                                </ig:ContextMenuManager.ContextMenu>
                                            </ig:ContextMenuManager>
                                        </ig:ContextMenuService.Manager>
                                    </ToggleButton>

                                    <ListBox Grid.Row="1" Height="Auto" x:Name="listBox1" Width="Auto" HorizontalAlignment="Stretch"
                                     ItemsSource="{Binding Path=Profile, Mode=TwoWay}" SelectionMode="Extended" 
                                     dp:ListBoxExtenders.AutoScrollToCurrentItem="True">

                                        <ListBox.Style>
                                            <Style TargetType="ListBox">
                                                <Setter Property="Background" Value="{Binding Path=Status, Converter={StaticResource ProfileStatusIndicator}}"/>
                                            </Style>
                                        </ListBox.Style>
                                        <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <TextBox Text="{Binding}" Style="{StaticResource BucketProfileStyle}" />
                                            </DataTemplate>
                                        </ListBox.ItemTemplate>
                                        <ItemsControl.ItemsPanel>
                                            <ItemsPanelTemplate>
                                                <StackPanel  Orientation="Vertical"  VerticalAlignment="Top"  HorizontalAlignment="Stretch">
                                                </StackPanel>
                                            </ItemsPanelTemplate>
                                        </ItemsControl.ItemsPanel>
                                    </ListBox>
                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                        <!--</ItemsControl>-->

                    </ListBox>
                </toolkit:ListBoxDragDropTarget>
            </toolkit:DockPanel>

        </ScrollViewer>

enter image description here

Kans
  • 33
  • 6
  • Have a look at http://stackoverflow.com/questions/4851541/listbox-drag-reorder-index-of-the-dropped-item – Chui Tey Aug 15 '12 at 03:34
  • Thanks a lot Chui Tey, the link helped me explore other links which gave me some more links and in the end am able to achieve the goal. I changed the itemscontrol to use a ListBox instead and used the dragdrop targets to achieve the desired functionality. Will update the code to reflect the same. – Kans Aug 16 '12 at 14:44

2 Answers2

1

So using a dragdropTarget, i was able to achieve the required result, leaving the complete solution above just for clarity.

<toolkit:ListBoxDragDropTarget AllowDrop="True" AllowedSourceEffects="Move" toolkit:DockPanel.Dock="Left" BorderThickness="0" Padding="0" VerticalAlignment="Top">
Kans
  • 33
  • 6
0

Solved using drag drop targets, updated solution posted above if somebody wants it.

Kans
  • 33
  • 6
  • You should post the working code in the answer section, and leave out items like the ContextMenu so that the approach will be clearer. I'll vote it up. – Chui Tey Aug 16 '12 at 21:58