在wpf中拖放时如何设置Listview ItemTemplate

时间:2018-07-11 10:47:43

标签: c# wpf xaml drag-and-drop

我已经在WPF中创建了简单的拖放操作。在我的应用程序中,有两个Listview。我必须将列表项从第一个列表视图拖放到第二个列表视图。我已经为第一个列表视图创建了自定义数据模板。当我将第一个listview项目拖到第二个listview中时,数据模板未自定义,因此不会显示项目。如何显示具有泛型的列表项。请帮忙。我的代码如下,

 <Grid Margin="0,20,0,0">

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <ListBox
            Name="memberCollection"
            Grid.Column="1"
            Width="150"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"
            PreviewMouseLeftButtonDown="memberCollection_PreviewMouseLeftButtonDown">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBox Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Grid
            Name="gridDrop"
            Grid.Column="0"
            Margin="20,0,0,0"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"
            ListBox.Drop="grid_Drop"
            ShowGridLines="True">

            <ListBox
                Grid.Row="0"
                Grid.Column="0"
                Margin="10,10,0,0"
                AllowDrop="True" />           
        </Grid>
    </Grid>

隐藏代码

ObservableCollection<Member> member = new ObservableCollection<Member>();

        public MainWindow()
        {
            InitializeComponent();

            member.Add(new Member { Name = "Karthick", ID = "20011", Address = "10, MainRoad, Chennai" });            

            memberCollection.ItemsSource = member;
            DataContext = new Member();
        }

        private void memberCollection_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            object selectedMember = memberCollection.SelectedItem as Member;
            if (selectedMember != null)
                DragDrop.DoDragDrop(memberCollection, selectedMember, DragDropEffects.All);
        }

        private void grid_Drop(object sender, RoutedEventArgs e)
        {
            ListBox listContent = e.Source as ListBox;
            if (listContent != null)
                Console.WriteLine("", Grid.GetColumn(listContent), Grid.GetRow(listContent));

            DataObject item = (((DragEventArgs)e).Data) as DataObject;
            object Target = ((Grid)(sender)).DataContext;
            object listItem = item.GetData(Target.GetType());

            if (listItem != null)
            {
                //listContent.Items.Add(listItem.Name.ToString());
                //listContent.Items.Add(listItem.ID.ToString());
                //listContent.Items.Add(listItem.Address.ToString()); 

                //listContent.ItemTemplate = memberCollection.ItemTemplate;                              

                listContent.Items.Add(listItem);

            }
        }

Current Output

I want to display like this

1 个答案:

答案 0 :(得分:0)

如果将DataTemplate定义为可重用资源,则可以在ListBoxes两者中使用它:

<Grid Margin="0,20,0,0">
    <Grid.Resources>
        <DataTemplate x:Key="dataTemplate">
            <StackPanel>
                <TextBox Text="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </Grid.Resources>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <ListBox
            Name="memberCollection"
            Grid.Column="1"
            Width="150"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"
            PreviewMouseLeftButtonDown="memberCollection_PreviewMouseLeftButtonDown"
            ItemTemplate="{StaticResource dataTemplate}" />

    <Grid
            Name="gridDrop"
            Grid.Column="0"
            Margin="20,0,0,0"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"
            ListBox.Drop="grid_Drop"
            ShowGridLines="True">

        <ListBox
                Grid.Row="0"
                Grid.Column="0"
                Margin="10,10,0,0"
                AllowDrop="True"
                ItemTemplate="{StaticResource dataTemplate}"/>
    </Grid>
</Grid>

如果要在第二个Member中显示放置的ListBox的其他属性,则应定义另一个ItemTemplate

<ListBox
    Grid.Row="0"
    Grid.Column="0"
    Margin="10,10,0,0"
    AllowDrop="True">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Name}" />
                <TextBlock Text="{Binding Id}" />
                <TextBlock Tag="{Binding Address}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>