Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Finally i got the Problem and also made some changes for this to work properly</p> <p>I used <a href="http://www.hardcodet.net/2009/03/moving-data-grid-rows-using-drag-and-drop" rel="noreferrer">this</a> example to make the <code>Drag Drop Logic</code> amd made this behavior may be its use ful to others .... please suggest improvements i would be happy to change ... </p> <h1>Behavior</h1> <pre><code>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using Microsoft.Windows.Controls; using System.Windows.Input; using System.Collections; namespace DataGridDragAndDrop { public static class DragDropRowBehavior { private static DataGrid dataGrid; private static Popup popup; private static bool enable; private static object draggedItem; public static object DraggedItem { get { return DragDropRowBehavior.draggedItem; } set { DragDropRowBehavior.draggedItem = value; } } public static Popup GetPopupControl(DependencyObject obj) { return (Popup)obj.GetValue(PopupControlProperty); } public static void SetPopupControl(DependencyObject obj, Popup value) { obj.SetValue(PopupControlProperty, value); } // Using a DependencyProperty as the backing store for PopupControl. This enables animation, styling, binding, etc... public static readonly DependencyProperty PopupControlProperty = DependencyProperty.RegisterAttached("PopupControl", typeof(Popup), typeof(DragDropRowBehavior), new UIPropertyMetadata(null, OnPopupControlChanged)); private static void OnPopupControlChanged(DependencyObject depObject, DependencyPropertyChangedEventArgs e) { if (e.NewValue == null || !(e.NewValue is Popup)) { throw new ArgumentException("Popup Control should be set", "PopupControl"); } popup = e.NewValue as Popup; dataGrid = depObject as DataGrid; // Check if DataGrid if (dataGrid == null) return; if (enable &amp;&amp; popup != null) { dataGrid.BeginningEdit += new EventHandler&lt;DataGridBeginningEditEventArgs&gt;(OnBeginEdit); dataGrid.CellEditEnding += new EventHandler&lt;DataGridCellEditEndingEventArgs&gt;(OnEndEdit); dataGrid.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(OnMouseLeftButtonUp); dataGrid.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(OnMouseLeftButtonDown); dataGrid.MouseMove += new MouseEventHandler(OnMouseMove); } else { dataGrid.BeginningEdit -= new EventHandler&lt;DataGridBeginningEditEventArgs&gt;(OnBeginEdit); dataGrid.CellEditEnding -= new EventHandler&lt;DataGridCellEditEndingEventArgs&gt;(OnEndEdit); dataGrid.MouseLeftButtonUp -= new System.Windows.Input.MouseButtonEventHandler(OnMouseLeftButtonUp); dataGrid.MouseLeftButtonDown -= new MouseButtonEventHandler(OnMouseLeftButtonDown); dataGrid.MouseMove -= new MouseEventHandler(OnMouseMove); dataGrid = null; popup = null; draggedItem = null; IsEditing = false; IsDragging = false; } } public static bool GetEnabled(DependencyObject obj) { return (bool)obj.GetValue(EnabledProperty); } public static void SetEnabled(DependencyObject obj, bool value) { obj.SetValue(EnabledProperty, value); } // Using a DependencyProperty as the backing store for Enabled. This enables animation, styling, binding, etc... public static readonly DependencyProperty EnabledProperty = DependencyProperty.RegisterAttached("Enabled", typeof(bool), typeof(DragDropRowBehavior), new UIPropertyMetadata(false,OnEnabledChanged)); private static void OnEnabledChanged(DependencyObject depObject,DependencyPropertyChangedEventArgs e) { //Check if value is a Boolean Type if (e.NewValue is bool == false) throw new ArgumentException("Value should be of bool type", "Enabled"); enable = (bool)e.NewValue; } public static bool IsEditing { get; set; } public static bool IsDragging { get; set; } private static void OnBeginEdit(object sender, DataGridBeginningEditEventArgs e) { IsEditing = true; //in case we are in the middle of a drag/drop operation, cancel it... if (IsDragging) ResetDragDrop(); } private static void OnEndEdit(object sender, DataGridCellEditEndingEventArgs e) { IsEditing = false; } /// &lt;summary&gt; /// Initiates a drag action if the grid is not in edit mode. /// &lt;/summary&gt; private static void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (IsEditing) return; var row = UIHelpers.TryFindFromPoint&lt;DataGridRow&gt;((UIElement)sender, e.GetPosition(dataGrid)); if (row == null || row.IsEditing) return; //set flag that indicates we're capturing mouse movements IsDragging = true; DraggedItem = row.Item; } /// &lt;summary&gt; /// Completes a drag/drop operation. /// &lt;/summary&gt; private static void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (!IsDragging || IsEditing) { return; } //get the target item var targetItem = dataGrid.SelectedItem; if (targetItem == null || !ReferenceEquals(DraggedItem, targetItem)) { //get target index var targetIndex = ((dataGrid).ItemsSource as IList).IndexOf(targetItem); //remove the source from the list ((dataGrid).ItemsSource as IList).Remove(DraggedItem); //move source at the target's location ((dataGrid).ItemsSource as IList).Insert(targetIndex, DraggedItem); //select the dropped item dataGrid.SelectedItem = DraggedItem; } //reset ResetDragDrop(); } /// &lt;summary&gt; /// Closes the popup and resets the /// grid to read-enabled mode. /// &lt;/summary&gt; private static void ResetDragDrop() { IsDragging = false; popup.IsOpen = false; dataGrid.IsReadOnly = false; } /// &lt;summary&gt; /// Updates the popup's position in case of a drag/drop operation. /// &lt;/summary&gt; private static void OnMouseMove(object sender, MouseEventArgs e) { if (!IsDragging || e.LeftButton != MouseButtonState.Pressed) return; popup.DataContext = DraggedItem; //display the popup if it hasn't been opened yet if (!popup.IsOpen) { //switch to read-only mode dataGrid.IsReadOnly = true; //make sure the popup is visible popup.IsOpen = true; } Size popupSize = new Size(popup.ActualWidth, popup.ActualHeight); popup.PlacementRectangle = new Rect(e.GetPosition(dataGrid), popupSize); //make sure the row under the grid is being selected Point position = e.GetPosition(dataGrid); var row = UIHelpers.TryFindFromPoint&lt;DataGridRow&gt;(dataGrid, position); if (row != null) dataGrid.SelectedItem = row.Item; } } } </code></pre> <h1>UIHelper Class</h1> <pre><code>public static class UIHelpers { #region find parent /// &lt;summary&gt; /// Finds a parent of a given item on the visual tree. /// &lt;/summary&gt; /// &lt;typeparam name="T"&gt;The type of the queried item.&lt;/typeparam&gt; /// &lt;param name="child"&gt;A direct or indirect child of the /// queried item.&lt;/param&gt; /// &lt;returns&gt;The first parent item that matches the submitted /// type parameter. If not matching item can be found, a null /// reference is being returned.&lt;/returns&gt; public static T TryFindParent&lt;T&gt;(DependencyObject child) where T : DependencyObject { //get parent item DependencyObject parentObject = GetParentObject(child); //we've reached the end of the tree if (parentObject == null) return null; //check if the parent matches the type we're looking for T parent = parentObject as T; if (parent != null) { return parent; } else { //use recursion to proceed with next level return TryFindParent&lt;T&gt;(parentObject); } } /// &lt;summary&gt; /// This method is an alternative to WPF's /// &lt;see cref="VisualTreeHelper.GetParent"/&gt; method, which also /// supports content elements. Do note, that for content element, /// this method falls back to the logical tree of the element. /// &lt;/summary&gt; /// &lt;param name="child"&gt;The item to be processed.&lt;/param&gt; /// &lt;returns&gt;The submitted item's parent, if available. Otherwise /// null.&lt;/returns&gt; public static DependencyObject GetParentObject(DependencyObject child) { if (child == null) return null; ContentElement contentElement = child as ContentElement; if (contentElement != null) { DependencyObject parent = ContentOperations.GetParent(contentElement); if (parent != null) return parent; FrameworkContentElement fce = contentElement as FrameworkContentElement; return fce != null ? fce.Parent : null; } //if it's not a ContentElement, rely on VisualTreeHelper return VisualTreeHelper.GetParent(child); } #endregion #region update binding sources /// &lt;summary&gt; /// Recursively processes a given dependency object and all its /// children, and updates sources of all objects that use a /// binding expression on a given property. /// &lt;/summary&gt; /// &lt;param name="obj"&gt;The dependency object that marks a starting /// point. This could be a dialog window or a panel control that /// hosts bound controls.&lt;/param&gt; /// &lt;param name="properties"&gt;The properties to be updated if /// &lt;paramref name="obj"/&gt; or one of its childs provide it along /// with a binding expression.&lt;/param&gt; public static void UpdateBindingSources(DependencyObject obj, params DependencyProperty[] properties) { foreach (DependencyProperty depProperty in properties) { //check whether the submitted object provides a bound property //that matches the property parameters BindingExpression be = BindingOperations.GetBindingExpression(obj, depProperty); if (be != null) be.UpdateSource(); } int count = VisualTreeHelper.GetChildrenCount(obj); for (int i = 0; i &lt; count; i++) { //process child items recursively DependencyObject childObject = VisualTreeHelper.GetChild(obj, i); UpdateBindingSources(childObject, properties); } } #endregion /// &lt;summary&gt; /// Tries to locate a given item within the visual tree, /// starting with the dependency object at a given position. /// &lt;/summary&gt; /// &lt;typeparam name="T"&gt;The type of the element to be found /// on the visual tree of the element at the given location.&lt;/typeparam&gt; /// &lt;param name="reference"&gt;The main element which is used to perform /// hit testing.&lt;/param&gt; /// &lt;param name="point"&gt;The position to be evaluated on the origin.&lt;/param&gt; public static T TryFindFromPoint&lt;T&gt;(UIElement reference, Point point) where T : DependencyObject { DependencyObject element = reference.InputHitTest(point) as DependencyObject; if (element == null) return null; else if (element is T) return (T)element; else return TryFindParent&lt;T&gt;(element); } } </code></pre> <h1>Usage </h1> <pre><code> &lt;!-- Drag and Drop Popup --&gt; &lt;Popup x:Name="popup1" AllowsTransparency="True" IsHitTestVisible="False" Placement="RelativePoint" PlacementTarget="{Binding ElementName=shareGrid}"&gt; &lt;!-- Your own Popup construction Use properties of DraggedObject inside for Binding --&gt; &lt;TextBlock Margin="8,0,0,0" VerticalAlignment="Center" FontSize="14" FontWeight="Bold" &lt;!-- I used name property of in my Dragged row --&gt; Text="{Binding Path=Name}" /&gt; &lt;/Popup&gt; &lt;DataGrid x:Name="myDataGrid" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="False" ItemsSource="{Binding}" SelectionMode="Single" this:DragDropRowBehavior.Enabled="True" this:DragDropRowBehavior.PopupControl="{Binding ElementName=popup1}"&gt;&lt;/DataGrid &gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload