【问题标题】:Drag and Drop from a DataGrid to a ListBoxItem从 DataGrid 拖放到 ListBoxItem
【发布时间】:2011-01-12 16:00:10
【问题描述】:

我有一个 ListBox(在 XAML 中定义了 ItemTemplate)和一个 DataGrid。 我想执行从 DataGrid 到 ListBox 的拖放操作。 我的问题是我不明白如何知道拖动的行已被拖放到哪个 ListBoxItem 上。

有人有想法吗?

提前致谢。

编辑:这是 ListBox 的 XAML:

<toolkit:DockPanel Grid.Column="0" Grid.Row="0" Grid.RowSpan="3" Width="200">
            <toolkit:ListBoxDragDropTarget Name="dropTarget1"  AllowDrop="True" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" AllowedSourceEffects="Move">
                <ListBox Name="lbClusters">

                    <!-- Override default HorizontalContentAlignment -->
                    <ListBox.ItemContainerStyle>
                        <Style TargetType="ListBoxItem">
                            <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
                        </Style>
                    </ListBox.ItemContainerStyle>

                    <!-- Override default presentation panel (to be able to organize) -->
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel />
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>

                    <!--  Items presentation -->
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Border BorderBrush="Black" BorderThickness="1" Margin="5">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition />
                                        <RowDefinition />
                                    </Grid.RowDefinitions>

                                    <Border Background="Gray" Padding="10,5,0,5" Grid.Row="0" >
                                        <TextBlock Text="{Binding Name}" HorizontalAlignment="Stretch" />
                                    </Border>
                                    <ListBox ItemsSource="{Binding MatchingProcessors}" DisplayMemberPath="Name" Grid.Row="1" MinHeight="100" />
                                </Grid>
                            </Border>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </toolkit:ListBoxDragDropTarget>
        </toolkit:DockPanel>

这里是 DataGrid:

<toolkit:DataGridDragDropTarget VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch">

                <sdk:DataGrid Name="Grid1" SelectionChanged="Grid_SelectionChanged" AutoGenerateColumns="False">
                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTextColumn Binding="{Binding Configuration.Nickname}" Header="NickName" />
                        <sdk:DataGridTextColumn Binding="{Binding SerialNumber}" Header="SN" />
                        <sdk:DataGridTextColumn Binding="{Binding ComputerName}" Header="IPHostname"/>
                        <sdk:DataGridTextColumn Binding="{Binding Configuration.GroupName}" Header="Group" />
                    </sdk:DataGrid.Columns>
                </sdk:DataGrid>

            </toolkit:DataGridDragDropTarget>

【问题讨论】:

    标签: datagrid silverlight-4.0 drag-and-drop listboxitem


    【解决方案1】:

    好的,这就是我所做的......也许有更好的解决方案?但这一款似乎符合我的需要。

    我更改了我的 ListBox.ItemTemplate 以在网格上添加 2 个事件:MouseEnterMouseLeave

    <ListBox.ItemTemplate>
    <DataTemplate>
        <Border BorderBrush="Black" BorderThickness="1" Margin="5">
            <Grid MouseEnter="Grid_MouseEnter" MouseLeave="Grid_MouseLeave">
                <Grid.RowDefinitions>                                            
                    <RowDefinition />                                            
                    <RowDefinition />
                </Grid.RowDefinitions>
    
                <Border Background="Gray" Padding="10,5,0,5" Grid.Row="0" >
                    <TextBlock Text="{Binding Name, Mode=TwoWay}" HorizontalAlignment="Stretch" />
                </Border>
                <ListBox ItemsSource="{Binding MatchingProcessors, Mode=TwoWay}" DisplayMemberPath="SerialNumber" Grid.Row="1" MinHeight="100" />
            </Grid>
        </Border>
    </DataTemplate>
    </ListBox.ItemTemplate>
    

    然后在代码中我实现了这些事件,并在 ListBox 中保留对悬停元素的引用。

        private ListBoxItem currentListBoxItem = null;
    
        private void Grid_MouseEnter(object sender, MouseEventArgs e)
        {
            List<UIElement> list = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), LayoutRoot as UIElement) as List<UIElement>;
            var tmp = list.OfType<ListBoxItem>().Where(el => el.DataContext != null && el.DataContext is MyType).FirstOrDefault();
    
            if (tmp != null)
            {
                this.currentListBoxItem = tmp;
            }
        }
    
        private void Grid_MouseLeave(object sender, MouseEventArgs e)
        {
            this.currentListBoxItem = null;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      相关资源
      最近更新 更多