Silverlight 4 ListBoxDragDropTarget перетащите на ListBoxItem - PullRequest
1 голос
/ 06 апреля 2011

У меня есть 2 списка (ListA и ListB), которые отображают данные из разных объектов (EntityA, EntityB). Эти сущности связаны - у EntityA есть свойство коллекции EntityB. Я хочу использовать функцию перетаскивания для добавления элементов из ListB в коллекцию удаленных элементов в ListA.

Чтобы уточнить, я не хочу добавлять ListItemB в коллекцию выбранного ListItemA, я хочу добавить его в коллекцию элемента списка, на который я его перетаскиваю (ListItemA, на который наведена мышь, когда я отпускаю ).

Используя ListBoxDragDropTarget, возможно ли, чтобы ListBoxItem был целью удаления вместо самого списка?

Какие-либо предложения относительно решения для этого сценария?

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

После небольшой работы я думаю, что у меня есть:

<StackPanel Orientation="Horizontal">
            <Controls:ListBoxDragDropTarget AllowDrop="True">
                <ListBox x:Name="FromBox" Width="200" ItemsSource="{Binding IssueList}" DisplayMemberPath="Name"/>
            </Controls:ListBoxDragDropTarget>

            <Controls:ListBoxDragDropTarget AllowDrop="True" Drop="ToBoxDragDropTarget_Drop">
                <ListBox x:Name="ToBox" Width="150" ItemsSource="{Binding ObjectiveList}" DisplayMemberPath="Name" Margin="80,0,0,0" />
            </Controls:ListBoxDragDropTarget>

            <TextBlock x:Name="UpdateText"/>
        </StackPanel>

и кодовый код (который теперь будет преобразован в мою ViewModel):

public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();            
            IssueList = new ObservableCollection<Issue>
                                                  {
                                                      new Issue{ ID = 1, Name="One"},
                                                      new Issue{ ID = 2, Name="Two"},
                                                      new Issue{ ID = 3, Name="Three"},
                                                      new Issue{ ID = 4, Name="Four"},
                                                      new Issue{ ID = 5, Name="Five"},
                                                  };
            ObjectiveList = new ObservableCollection<Objective>
                                                          {
                                                              new Objective {ID = 10, Name = "Ten"},
                                                              new Objective {ID = 11, Name = "Eleven"},
                                                              new Objective {ID = 12, Name = "Twelve"},
                                                              new Objective {ID = 13, Name = "Thirteen"},
                                                              new Objective {ID = 14, Name = "Fourteen"},
                                                          };

            LayoutRoot.DataContext = this;
        }

        public ObservableCollection<Issue> IssueList { get; set; }
        public ObservableCollection<Objective> ObjectiveList { get; set; }

        private void ToBoxDragDropTarget_Drop(object sender, Microsoft.Windows.DragEventArgs e)
        {
            var droppedOnObjective = ((FrameworkElement)e.OriginalSource).DataContext as Objective;
            var args = e.Data.GetData(typeof(ItemDragEventArgs)) as ItemDragEventArgs;
            if (args != null)
            {
                var draggedItems = args.Data as SelectionCollection;
                var draggedItem = draggedItems[0];
                if (droppedOnObjective != null)
                {
                    var draggedIssue = (Issue)draggedItem.Item;


                    if (!droppedOnObjective.Issues.Contains(draggedIssue))
                    {
                        droppedOnObjective.Issues.Add(draggedIssue);
                        UpdateText.Text = string.Format("Issue <{0}> added to Objective <{1}>", draggedIssue.Name, droppedOnObjective.Name);
                    }
                    else
                    {
                        UpdateText.Text = string.Format("Objective <{0}> already contains Issue <{1}>", droppedOnObjective.Name, draggedIssue.Name);
                    }                    
                }
                else
                    UpdateText.Text = "selections or dropOnObjective is null";
            }
            else
                UpdateText.Text = "args null";
        }
    }

    public class Issue
    {
        public int ID { get; set; }
        public string Name { get; set; }

    }

    public class Objective
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public List<Issue> Issues { get; set; }

        public Objective()
        {
            Issues = new List<Issue>();
        }        
    }
1 голос
/ 06 апреля 2011

Это можно сделать, создав два ListBox, как вы описали, один привязан к ObservableCollection<EntityA>, а другой - к ObservableCollection<EntityB>.EntityA содержит ObservableCollection<EntityB> как свойство.Элементы ListBox EntityA имеют шаблон для отображения дочерней коллекции EntityB в виде ListBox.ListBoxDragDropTarget указывается в этом ItemTemplate, а не в родительском элементе.Вот несколько примеров для демонстрации XAML:

 <ListBox Name="listOfEntityA">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding EntityName}" />
                    <toolKit:ListBoxDragDropTarget AllowDrop="True" AllowedSourceEffects="All">
                        <ListBox ItemsSource="{Binding ChildEntityBs}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding EntityName}" />
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </toolKit:ListBoxDragDropTarget>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <toolKit:ListBoxDragDropTarget AllowDrop="True" AllowedSourceEffects="All">
        <ListBox Name="listOfEntityB" />
    </toolKit:ListBoxDragDropTarget>
...