Guten Morgen allerseits :-)!
Ich versuche gerade, die Zeilen eines DataGrid mit der Maus "verschiebbar" zu machen und habe im Internet eine C#-Klasse gefunden, die ich mit einem Online-Übersetzer ins Folgende übersetzt habe:
Spoiler anzeigen
Leider gibt es in der
Und zwar bei
"Public Event PreviewMouseLeftButtonDown As MouseButtonEventHandler" ist ein Ereignis und kann nicht direkt aufgerufen werden. Verwenden Sie eine RaiseEvent-Anweisung, um ein Ereignis aufzurufen.
Wenn ich jetzt aber ein RaiseEvent davorschreibe, kommt: "grid" ist kein Ereignis von "Visual Helper".
Der XAML sieht folgendermassen aus:
Weiss jemand Abhilfe?
Ich versuche gerade, die Zeilen eines DataGrid mit der Maus "verschiebbar" zu machen und habe im Internet eine C#-Klasse gefunden, die ich mit einem Online-Übersetzer ins Folgende übersetzt habe:
VB.NET-Quellcode
- Imports System
- Imports System.Collections
- Imports System.Collections.Generic
- Imports System.Linq
- Imports System.Text
- Imports System.Threading.Tasks
- Imports System.Windows
- Imports System.Windows.Controls
- Imports System.Windows.Input
- Imports System.Windows.Media
- Namespace DataGridMovableRows
- Public Class VisualHelper
- Inherits ViewModel.Instrastructure.ViewModelBase
- Public Shared ReadOnly EnableRowsMoveProperty As DependencyProperty = DependencyProperty.RegisterAttached("EnableRowsMove", GetType(Boolean), GetType(VisualHelper), New PropertyMetadata(False, AddressOf EnableRowsMoveChanged))
- Private Shared ReadOnly DraggedItemProperty As DependencyProperty = DependencyProperty.RegisterAttached("DraggedItem", GetType(Object), GetType(VisualHelper), New PropertyMetadata(Nothing))
- Public Shared Function GetEnableRowsMove(ByVal obj As DataGrid) As Boolean
- Return CBool(obj.GetValue(EnableRowsMoveProperty))
- End Function
- Public Shared Sub SetEnableRowsMove(ByVal obj As DataGrid, ByVal value As Boolean)
- obj.SetValue(EnableRowsMoveProperty, value)
- End Sub
- Private Shared Function GetDraggedItem(ByVal obj As DependencyObject) As Object
- Return CObj(obj.GetValue(DraggedItemProperty))
- End Function
- Private Shared Sub SetDraggedItem(ByVal obj As DependencyObject, ByVal value As Object)
- obj.SetValue(DraggedItemProperty, value)
- End Sub
- Private Shared Sub EnableRowsMoveChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
- Dim grid = (TryCast(d, DataGrid))
- If grid Is Nothing Then Return
- If CBool(e.NewValue) Then
- grid.PreviewMouseLeftButtonDown += AddressOf OnMouseLeftButtonDown
- grid.PreviewMouseLeftButtonUp += AddressOf OnMouseLeftButtonUp
- grid.PreviewMouseMove += AddressOf OnMouseMove
- Else
- grid.PreviewMouseLeftButtonDown -= AddressOf OnMouseLeftButtonDown
- grid.PreviewMouseLeftButtonUp -= AddressOf OnMouseLeftButtonUp
- grid.PreviewMouseMove -= AddressOf OnMouseMove
- End If
- End Sub
- Private Shared Sub OnMouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
- Dim row = TryFindFromPoint(Of DataGridRow)(CType(sender, UIElement), e.GetPosition((TryCast(sender, DataGrid))))
- If row Is Nothing OrElse row.IsEditing Then Return
- VisualHelper.SetDraggedItem(TryCast(sender, DataGrid), row.Item)
- End Sub
- Private Shared Sub OnMouseLeftButtonUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
- Dim draggeditem = VisualHelper.GetDraggedItem(TryCast(sender, DependencyObject))
- If draggeditem Is Nothing Then Return
- ExchangeItems(sender, (TryCast(sender, DataGrid)).SelectedItem)
- TryCast(sender, DataGrid).SelectedItem = draggeditem
- VisualHelper.SetDraggedItem(TryCast(sender, DataGrid), Nothing)
- End Sub
- Private Shared Sub OnMouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
- Dim draggeditem = VisualHelper.GetDraggedItem(TryCast(sender, DependencyObject))
- If draggeditem Is Nothing Then Return
- Dim row = TryFindFromPoint(Of DataGridRow)(CType(sender, UIElement), e.GetPosition((TryCast(sender, DataGrid))))
- If row Is Nothing OrElse row.IsEditing Then Return
- ExchangeItems(sender, row.Item)
- End Sub
- Private Shared Sub ExchangeItems(ByVal sender As Object, ByVal targetItem As Object)
- Dim draggeditem = VisualHelper.GetDraggedItem(TryCast(sender, DependencyObject))
- If draggeditem Is Nothing Then Return
- If targetItem IsNot Nothing AndAlso Not ReferenceEquals(draggeditem, targetItem) Then
- Dim list = TryCast((TryCast(sender, DataGrid)).ItemsSource, IList)
- If list Is Nothing Then Throw New ApplicationException("EnableRowsMoveProperty requires the ItemsSource property of DataGrid to be at least IList inherited collection. Use ObservableCollection to have movements reflected in UI.")
- Dim targetIndex = list.IndexOf(targetItem)
- list.Remove(draggeditem)
- list.Insert(targetIndex, draggeditem)
- End If
- End Sub
- Public Shared Function FindVisualParent(Of T As DependencyObject)(ByVal child As DependencyObject) As T
- Dim parentObject = VisualTreeHelper.GetParent(child)
- If parentObject Is Nothing Then Return Nothing
- Dim parent As T = TryCast(parentObject, T)
- If parent IsNot Nothing Then
- Return parent
- Else
- Return FindVisualParent(Of T)(parentObject)
- End If
- End Function
- Public Shared Function TryFindFromPoint(Of T As DependencyObject)(ByVal reference As UIElement, ByVal point As Point) As T
- Dim element = TryCast(reference.InputHitTest(point), DependencyObject)
- If element Is Nothing Then Return Nothing
- If TypeOf element Is T Then Return CType(element, T)
- Return FindVisualParent(Of T)(element)
- End Function
- End Class
- End Namespace
Leider gibt es in der
Sub EnableRowsMoveChanged
rot unterstrichene Fehler, die ich nicht zu beheben weiss:VB.NET-Quellcode
- Private Shared Sub EnableRowsMoveChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
- Dim grid = (TryCast(d, DataGrid))
- If grid Is Nothing Then Return
- If CBool(e.NewValue) Then
- grid.PreviewMouseLeftButtonDown += AddressOf OnMouseLeftButtonDown
- grid.PreviewMouseLeftButtonUp += AddressOf OnMouseLeftButtonUp
- grid.PreviewMouseMove += AddressOf OnMouseMove
- Else
- grid.PreviewMouseLeftButtonDown -= AddressOf OnMouseLeftButtonDown
- grid.PreviewMouseLeftButtonUp -= AddressOf OnMouseLeftButtonUp
- grid.PreviewMouseMove -= AddressOf OnMouseMove
- End If
- End Sub
Und zwar bei
grid.PreviewMouseLeftButtonDown
, grid.PreviewMouseLeftButtonUp
, usw. kommt die Fehlermeldung:"Public Event PreviewMouseLeftButtonDown As MouseButtonEventHandler" ist ein Ereignis und kann nicht direkt aufgerufen werden. Verwenden Sie eine RaiseEvent-Anweisung, um ein Ereignis aufzurufen.
Wenn ich jetzt aber ein RaiseEvent davorschreibe, kommt: "grid" ist kein Ereignis von "Visual Helper".
Der XAML sieht folgendermassen aus:
Weiss jemand Abhilfe?