Hi All,
i have a requirement to implement d&d functionality for radgridview(only drag) to textBox (only drop) control.so i tried the drag and drop demo application comes with the telerik suite. gridview to listbox is working fine and the problem is don't know how to implement for textbox control and textbox value should be either one of the dragging column of gridview in MVVM pattern.
i have a requirement to implement d&d functionality for radgridview(only drag) to textBox (only drop) control.so i tried the drag and drop demo application comes with the telerik suite. gridview to listbox is working fine and the problem is don't know how to implement for textbox control and textbox value should be either one of the dragging column of gridview in MVVM pattern.
<UserControl x:Class="TelerikDragandDrop.MainWindow" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" xmlns:telerikDragandDrop="clr-namespace:TelerikDragandDrop"> <UserControl.Resources> <telerikDragandDrop:MainViewModel x:Key="ViewModel"/> <!--Note: With this style we make the ListBoxItems draggable:--> <Style TargetType="ListBoxItem" x:Key="WishlistItemStyle" > <Setter Property="telerik:DragDropManager.AllowCapturedDrag" Value="True" /> <Setter Property="telerik:DragDropManager.TouchDragTrigger" Value="TapAndHold"/> </Style> <Style TargetType="telerik:GridViewRow" x:Key="OrderItemStyle" > <Setter Property="telerik:DragDropManager.AllowCapturedDrag" Value="True" /> <Setter Property="telerik:DragDropManager.TouchDragTrigger" Value="TapAndHold"/> </Style> <Style TargetType="{x:Type TextBox}" x:Key="textBoxStyle"> <Setter Property="telerik:DragDropManager.AllowCapturedDrag" Value="False" /> <Setter Property="telerik:DragDropManager.TouchDragTrigger" Value="TapAndHold"/> <Setter Property="Foreground" Value="#777777" /> </Style> </UserControl.Resources> <Grid x:Name="LayoutRoot"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <!--Order--> <Border BorderBrush="#C8C9CC" BorderThickness="2" CornerRadius="6" Margin="46 46 0 46" Background="White" Grid.Column="1"> <DockPanel> <Border DockPanel.Dock="Top" Background="{telerik:Windows8Resource ResourceKey=AccentBrush}" CornerRadius="4 4 0 0"> <TextBlock Text="Order" Foreground="{telerik:Windows8Resource ResourceKey=MainBrush}" Margin="20 5 5 5" FontSize="14" /> </Border> <!--NOTE: The GridView is a drop target, we set the AllowDrop to true.--> <telerik:RadGridView x:Name="orderView" IsReadOnly="True" Grid.Column="1" Grid.Row="0" Margin="0,0,0,5" RowIndicatorVisibility="Collapsed" GroupRenderMode="Flat" ItemsSource="{Binding AllApplications, Source={StaticResource ViewModel}}" RowStyle="{StaticResource OrderItemStyle}" CanUserFreezeColumns=" False" CanUserInsertRows="False" CanUserReorderColumns="False" CanUserSortColumns="False" ShowGroupPanel="False" Padding="5" AllowDrop="True" telerikDragandDrop:GridViewDragDropBehavior.IsEnabled="True" Height="115"> <telerik:RadGridView.Resources> <DataTemplate x:Key="DraggedItemTemplate"> <StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="Dragging:"/> <TextBlock Text="{Binding CurrentDraggedItem.FirstName}" FontWeight="Bold"/> </StackPanel> </StackPanel> </DataTemplate> </telerik:RadGridView.Resources> </telerik:RadGridView> </DockPanel> </Border> <!--Whishlist--> <Border BorderBrush="#C8C9CC" BorderThickness="2" CornerRadius="6" Margin="46" Background="White" Grid.Column="2"> <DockPanel> <Border DockPanel.Dock="Top" Background="{telerik:Windows8Resource ResourceKey=AccentBrush}" CornerRadius="4 4 0 0"> <TextBlock Text="Wishlist" Margin="20 5 5 5" Foreground="{telerik:Windows8Resource ResourceKey=MainBrush}" FontSize="14" /> </Border> <!--NOTE: The ListBox is a drop target, we set the AllowDrop to true.--> <ListBox x:Name="wishlistView" Grid.Column="1" Grid.Row="1" SelectionMode="Extended" ItemsSource="{Binding MyApplications, Source={StaticResource ViewModel}}" FontSize="11" ItemContainerStyle="{StaticResource WishlistItemStyle}" Padding="5" AllowDrop="True" telerikDragandDrop:ListBoxDragDropBehavior.IsEnabled="True" telerik:TouchManager.IsTouchHitTestVisible="True"> <ListBox.Resources> <DataTemplate x:Key="DraggedItemTemplate"> <StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="Dragging:"/> <TextBlock Text="{Binding CurrentDraggedItem.FirstName}" FontWeight="Bold"/> </StackPanel> </StackPanel> </DataTemplate> </ListBox.Resources> <ListBox.ItemTemplate> <DataTemplate> <Grid Width="150"> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <TextBlock Grid.Row="1" Text="{Binding FirstName}" FontWeight="Bold" HorizontalAlignment="Center" Foreground="#FF767676"/> <TextBlock Text="{Binding LastName}" Grid.Row="2" HorizontalAlignment="Center" Foreground="#FF767676"/> </Grid> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </DockPanel> </Border> <TextBox Height="35" Name="TextBox1" Style="{StaticResource textBoxStyle}" AllowDrop="True" Width="225" Grid.Column="2" Margin="24,204,13,8" telerikDragandDrop:TextBoxDragDropBehaviour.IsEnabled="True" telerik:TouchManager.IsTouchHitTestVisible="True" /> </Grid></UserControl>public class TextBoxDragDropBehaviour { private TextBox _associatedObject; /// <summary> /// AssociatedObject Property /// </summary> public TextBox AssociatedObject { get { return _associatedObject; } set { _associatedObject = value; } } private static Dictionary<TextBox, TextBoxDragDropBehaviour> instances; static TextBoxDragDropBehaviour() { instances = new Dictionary<TextBox, TextBoxDragDropBehaviour>(); } public static bool GetIsEnabled(DependencyObject obj) { return (bool)obj.GetValue(IsEnabledProperty); } public static void SetIsEnabled(DependencyObject obj, bool value) { TextBoxDragDropBehaviour behavior = GetAttachedBehavior(obj as TextBox ); behavior.AssociatedObject = obj as TextBox; if (value) { behavior.Initialize(); } else { behavior.CleanUp(); } 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(TextBoxDragDropBehaviour), new PropertyMetadata(new PropertyChangedCallback(OnIsEnabledPropertyChanged))); public static void OnIsEnabledPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { SetIsEnabled(dependencyObject, (bool)e.NewValue); } private static TextBoxDragDropBehaviour GetAttachedBehavior(TextBox listBox) { if (!instances.ContainsKey(listBox)) { instances[listBox] = new TextBoxDragDropBehaviour(); instances[listBox].AssociatedObject = listBox; } return instances[listBox]; } protected virtual void Initialize() { this.UnsubscribeFromDragDropEvents(); this.SubscribeToDragDropEvents(); } protected virtual void CleanUp() { this.UnsubscribeFromDragDropEvents(); } private void SubscribeToDragDropEvents() { DragDropManager.AddDragInitializeHandler(this.AssociatedObject, OnDragInitialize); DragDropManager.AddGiveFeedbackHandler(this.AssociatedObject, OnGiveFeedback); DragDropManager.AddDropHandler(this.AssociatedObject, OnDrop); DragDropManager.AddDragDropCompletedHandler(this.AssociatedObject, OnDragDropCompleted); DragDropManager.AddDragOverHandler(this.AssociatedObject, OnDragOver); } private void UnsubscribeFromDragDropEvents() { DragDropManager.RemoveDragInitializeHandler(this.AssociatedObject, OnDragInitialize); DragDropManager.RemoveGiveFeedbackHandler(this.AssociatedObject, OnGiveFeedback); DragDropManager.RemoveDropHandler(this.AssociatedObject, OnDrop); DragDropManager.RemoveDragDropCompletedHandler(this.AssociatedObject, OnDragDropCompleted); DragDropManager.RemoveDragOverHandler(this.AssociatedObject, OnDragOver); } private void OnDragInitialize(object sender, DragInitializeEventArgs e) { DropIndicationDetails details = new DropIndicationDetails(); var listBoxItem = e.OriginalSource as System.Windows.Controls.ListBoxItem ?? (e.OriginalSource as FrameworkElement).ParentOfType<System.Windows.Controls.ListBoxItem>(); var textBox = sender as System.Windows.Controls.TextBox; if (textBox != null) { var item = listBoxItem != null ? listBoxItem.DataContext : textBox.Text; details.CurrentDraggedItem = item; IDragPayload dragPayload = DragDropPayloadManager.GeneratePayload(null); dragPayload.SetData("DraggedData", item); dragPayload.SetData("DropDetails", details); e.Data = dragPayload; } e.DragVisual = new DragVisual() { Content = details, ContentTemplate = this.AssociatedObject.Resources["DraggedItemTemplate"] as DataTemplate }; e.DragVisualOffset = e.RelativeStartPoint; e.AllowedEffects = DragDropEffects.All; } private void OnGiveFeedback(object sender, Telerik.Windows.DragDrop.GiveFeedbackEventArgs e) { e.SetCursor(Cursors.Arrow); e.Handled = true; } private void OnDragDropCompleted(object sender, DragDropCompletedEventArgs e) { var draggedItem = DragDropPayloadManager.GetDataFromObject(e.Data, "DraggedData"); if (e.Effects != DragDropEffects.None) { //var collection = (sender as TextBox).Text; //collection.Remove(draggedItem); } } private void OnDrop(object sender, Telerik.Windows.DragDrop.DragEventArgs e) { var draggedItem = DragDropPayloadManager.GetDataFromObject(e.Data, "DraggedData"); var details = DragDropPayloadManager.GetDataFromObject(e.Data, "DropDetails") as DropIndicationDetails; var itemsType = (this.AssociatedObject.Text); //if (details == null || draggedItem == null || draggedItem.GetType() != itemsType) //{ // return; //} if (e.Effects != DragDropEffects.None) { var collection = (sender as TextBox); if (collection != null) collection.Text = collection.Text; } } private void OnDragOver(object sender, Telerik.Windows.DragDrop.DragEventArgs e) { //var draggedItem = DragDropPayloadManager.GetDataFromObject(e.Data, "DraggedData"); //var itemsType = (this.AssociatedObject.ItemsSource as IList).AsQueryable().ElementType; //if (draggedItem.GetType() != itemsType) //{ // e.Effects = DragDropEffects.None; //} //var dropDetails = DragDropPayloadManager.GetDataFromObject(e.Data, "DropDetails") as DropIndicationDetails; //dropDetails.CurrentDraggedOverItem = this.AssociatedObject; //dropDetails.CurrentDropPosition = Controls.DropPosition.Inside; e.Handled = true; } }