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;
}
}