0

これに答えるために、しばらくの間、stackoverflow を調べてきました。

アイテムのリストビューは、実際には子が親リストビューアイテムのメンバーである(文字列の)リストであるリストビューです。

ドラッグ アンド ドロップ機能が目標です。ただし、これはさまざまな理由で困難であることが判明しており、その 1 つがキャスティングです。直接キャストして機能させる前に、型を取得する必要があります-少なくとも、1つの問題を解決できると思います。

ただし、この構文を機能させることさえできないため、ここから始めます。

   Dim itemType = listView.ItemContainerGenerator.ItemFromContainer(listViewItem)
   Dim g As Type = GetType(itemtype)

これは、私が試しているドラッグ アンド ドロップの実装全体です。

Dim startpoint As Point

Public Sub List_PreviewMouseLeftButtonDown(sender As Object, e As MouseEventArgs)
    ' Store the mouse position
    startpoint = e.GetPosition(Nothing)
End Sub

Private Sub List_MouseMove(sender As Object, e As MouseEventArgs)
    Dim mousePos As Point = e.GetPosition(Nothing)
    Dim diff As Vector = startpoint - mousePos
    If e.LeftButton = MouseButtonState.Pressed And Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance Or Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance Then
        Dim listView As ListView = DirectCast(sender, ListView)
        Dim listViewItem As ListViewItem = FindAncestor(Of ListViewItem)(DirectCast(e.OriginalSource, DependencyObject))
        Dim itemType = listView.ItemContainerGenerator.ItemFromContainer(listViewItem)
        Dim g As Type = GetType(itemtype)
        Dim item As String = DirectCast(listView.ItemContainerGenerator.ItemFromContainer(listViewItem), String)
        Dim dragData As New DataObject("myFormat", item)
        DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Move)
    End If

End Sub


Private Shared Function FindAncestor(Of T As DependencyObject)(current As DependencyObject) As T
    Do
        If TypeOf current Is T Then
            Return DirectCast(current, T)
        End If
        current = VisualTreeHelper.GetParent(current)
    Loop While current IsNot Nothing
    Return Nothing
End Function

Private Sub DropList_DragEnter(sender As Object, e As DragEventArgs)
    If Not e.Data.GetDataPresent("myFormat") OrElse sender = e.Source Then
        e.Effects = DragDropEffects.None
    End If
End Sub

Private Sub DropList_Drop(sender As Object, e As DragEventArgs)
    If e.Data.GetDataPresent("myFormat") Then
        Dim contact As String = TryCast(e.Data.GetData("myFormat"), String)
        Dim listView As ListView = TryCast(sender, ListView)
        listView.Items.Add(contact)
    End If
End Sub

ネストされた listView は次のとおりです。

 <!--DataContext="{StaticResource RcpdInsertViewSource}" This is a collectionviewsource. 
                        RCPDInsert has a list(of string) member that is created from a single string property 
                        and whose order needs to be alterable. 
                        Eg rcpdInsert.template="[stuff] [more stuff]" so rcpdInsert.templateList = list(of String) from template.split("] [") -->
                        <ListView Grid.Column="1" Grid.Row="1" ItemsSource="{Binding}"  
                                  PreviewMouseLeftButtonDown="List_PreviewMouseLeftButtonDown" 
                                  PreviewMouseMove="List_MouseMove"
                                  Drop="DropList_Drop" 
                                  DragEnter="DropList_DragEnter" 
                                  AllowDrop="True">

                                <ListView.ItemTemplate>
                                  <DataTemplate>
                                    <DockPanel>
                                        <TextBox Text="{Binding Path=cpID}"></TextBox>
                                        <TextBox Text="{Binding Path=fieldRef}"></TextBox>
                                        <ListView ItemsSource="{Binding Path=InsertsList}" >
                                            <ListView.ItemTemplate>
                                                <DataTemplate DataType="DataClasses1:RcpdInsert.template" >
                                                    <StackPanel Orientation="Horizontal" Grid.Row="0">
                                                        <TextBlock Text="{Binding}" Margin="5" />
                                                    </StackPanel>
                                                </DataTemplate>
                                            </ListView.ItemTemplate>
                                        </ListView>
                                    </DockPanel>
                                </DataTemplate>
                            </ListView.ItemTemplate>

                        </ListView>

目標: 子リストビューの並べ替えをドラッグ アンド ドロップします。理想的には、1 つの子リストビューから別の子リストビューに個々の項目をプルできます。保存すると、コード ビハインドは実際に文字列を連結し直し、テンプレート メンバーを更新します。

コンテキストについては、RcpdInsert の関連メンバーを次に示します。

Sub SetupInsertList()
        _insertsList = template.Split(" ").ToList()
        For Each item In InsertsList
            Dim t = item
            RcpdList.Add(RcpdSet.RpcdListShared.Where(Function(x) x.insertID = t).ToList())
        Next
    End Sub

    Public Property RcpdList As New List(Of List(Of Rcpd))

    Private Property _insertsList As New List(Of String)

    Public Property InsertsList As List(Of String)
        Get
            If _insertsList.Count = 0 Then setupInsertList()
            Return _insertsList
        End Get
        Set(value As List(Of String))
            Dim combine As String = value.Aggregate("", Function(current, i) current + (i & " "))
            template = combine
        End Set
    End Property

キャスティングはこれに関する 1 つの問題です。この部分を実行できるということは、他の部分が解決しやすくなることを意味することを願っています。

助けてくれる人に前もって感謝します:)

4

0 に答える 0