【问题标题】:How to set Listview Itemtemplate when drag drop in wpfwpf中拖放时如何设置Listview Itemtemplate
【发布时间】:2018-07-11 10:47:42
【问题描述】:

我在 WPF 中创建了简单的拖放。在我的应用程序中有两个 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);

            }
        }

【问题讨论】:

  • @mm8,感谢您的回复。我的要求是列表框一仅显示名称,当拖动列表框一时,所选项目显示到第二个列表框。当我使用相同的项目模板名称时,仅显示到第二个列表框。
  • 我不明白。你想在第二个 ListBox 中显示什么?
  • @mm8,请参考第二张截图
  • 怎么样? “20011”和“10,……”从何而来?
  • @mm8,我已经在后面的代码中初始化了成员类的observablecollection,请参考。 member.Add(new Member { Name = "Karthick", ID = "20011", Address = "10, MainRoad, Chennai" });

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


【解决方案1】:

如果您将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>

如果你想在第二个ListBox中显示被删除的Member的一些其他属性,你应该定义另一个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>

【讨论】:

    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 2010-09-07
    • 2020-10-12
    • 2019-11-05
    • 2011-06-16
    • 2010-10-04
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多