我有两个ListViews,我正在尝试设置拖放功能。每个ListView都是绑定到ObservableCollection(_upcomingList和_inProgressList)的数据,其中Tasks是我的模型之一。

我的设置方式是,当调用DragItemsStarting方法时,要拖动的项的ID(从绑定到_upcomingList的ListView)存储在字符串中,并设置为DataPackage。然后,当将该项目放在第二个ListView中(绑定到_inProgressList)时,从DataPackage中提取ID,然后用它在我的数据库中搜索完整的条目。最后,该项目的状态更改为“进行中”并添加到_inProgressList。

当我运行该应用程序并尝试将一个项目从一个ListView拖到下一个时,屏幕上什么都没有发生,但是await UpdateTask(taskToMove)肯定可以正常运行,因为我可以看到Tasks表在数据库中得到了更新,而下次运行该应用程序,我尝试将其拖到“进行中的ListView”中的任务现在出现在此处。这是我的drop方法的实现(更新部分下面有一个更新的版本):

public async Task IPLV_Drop(object sender, DragEventArgs e)
{
    if (e.DataView.Contains(StandardDataFormats.Text))
    {
        var id = await e.DataView.GetTextAsync();
        var tasksToMove = id.Split(',');

        tasks = await taskTable.ToCollectionAsync();

        if (_inProgressList != null)
        {
            foreach (var taskId in tasksToMove)
            {
                var taskToMove = tasks.First(i => i.Id.ToString() == taskId);

                taskToMove.Status = "In Progress";

                _inProgressList.Add(taskToMove);
                _upcomingList.Remove(taskToMove);

                await UpdateTask(taskToMove);
            }
        }
    }
}


一切似乎都正常运行,因此我错过了沿线的某个步骤,以便应用程序识别何时添加列表项以及从ObservableCollection中删除列表项,或者让ListViews在其源更改时绑定更新。

在此先感谢阅读本文的任何人!

更新

我最近在Shen Chauhan的博客(http://www.shenchauhan.com/)上找到了一个拖放示例,这使我稍微更改了Drop方法。现在,我不再尝试直接将删除的项目添加到我的ObservableCollection中,而是创建一个填充有ListView的itemsource的新集合,并将删除的项目添加到其中。

更新的Drop方法解决了在InProgress ListView中不出现被删除的项目的问题,但是,我仍然无法将要删除的项目从即将到来的ListView中删除。这是我目前存在的完整实现:

MainPage.xaml.cs

public sealed partial class MainPage : Page
{
    MainPageViewModel vm = new MainPageViewModel();

    public MainPage()
    {
        InitializeComponent();
    }

    private void UpcomingListView_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
    {
        var tasks = string.Join(",", e.Items.Cast<Tasks>().Select(t => t.Id));
        e.Data.SetText(tasks);
        e.Data.RequestedOperation = DataPackageOperation.Move;
    }

    private void inProgressListView_DragOver(object sender, DragEventArgs e)
    {
        e.AcceptedOperation = (e.DataView.Contains(StandardDataFormats.Text)) ? DataPackageOperation.Move : DataPackageOperation.None;
    }

    private async void InProgressListView_Drop(object sender, DragEventsArgs e)
    {
        await vm.IPLV_Drop(sender, e);
    }
}


MainPageViewModel.cs

public class MainPageViewModel : ViewModelBase
{
    private MobileServiceCollection<Tasks, Tasks> tasks;
    private IMobileServiceSyncTable<Tasks> taskTable = App.MobileService.GetSyncTable<Tasks>();

    private ObservableCollection<Tasks> upcomingList = default(ObservableCollection<Tasks>);
    public ObservableCollection<Tasks> _upcomingList { get { return upcomingList; } set { Set(ref upcomingList, value); } }

    private ObservableCollection<Tasks> inProgressList = default(ObservableCollection<Tasks>);
    public ObservableCollection<Tasks> _inProgressList { get { return inProgressList; } set { Set(ref inProgressList, value); } }

     ...

     public async Task IPLV_Drop(object sender, DragEventArgs e)
     {
         var id = await e.DataView.GetTextAsync();
         var tasksToMove = id.Split(',');

         var inProgressListView = sender as ListView;
         var IPLVItemsSource = inProgressListView?.ItemsSource as ObservableCollection<Tasks>;

         tasks = await taskTable.ToCollectionAsync();

         foreach (var taskId in taskToMove)
         {
             var taskToMove = tasks.First(t => t.Id.ToString() == taskId);

             _upcomingList.Remove(taskToMove) // DOES NOT REMOVE ITEM

             taskToMove.Status = "In Progress";

             IPLVItemsSource.Add(taskToMove); // NOW WORKS

             await UpdateTask(taskToMove);
         }
     }
}

最佳答案

IPLV_Drop任务中,有一个tasksToMovetaskToMove(我看不到在发布的代码中定义的位置),然后先遍历taskID和集合中找到与taskToMove匹配的第一个。

您的taskstaskID_inProgressList,当您对这两个集合进行操作时,该项目的数据模型应为_upcomingList。现在您可以从ObservableCollection<Tasks>获取项目,但是首先使用了<Tasks>,因此该项目的数据模型已更改,但应为MobileServiceCollection<Tasks, Tasks> tasks,而不是tasks = await taskTable.ToCollectionAsync();


  当我运行该应用程序并尝试将一个项目从一个ListView拖到下一个时,屏幕上什么也没有发生,但是,等待UpdateTask(taskToMove)确实可以正常运行,因为我可以看到Tasks表在数据库中更新了,而下一个当我运行该应用程序时,...


因此,我认为在Collection中找到的项目只能用于数据库操作,如果要刷新UI,则可能需要这样的代码:

public async Task IPLV_Drop(object sender, DragEventArgs e)
{
    var id = await e.DataView.GetTextAsync();
    var tasksToMove = id.Split(',');
    foreach(var taskToMove in tasksToMove)
    {
        __inProgressList.Add(taskToMove);
        _upcomingList.Remove(taskToMove);
    }


    //var inProgressListView = sender as ListView;
    //var IPLVItemsSource = inProgressListView?.ItemsSource as ObservableCollection<DataModel>;

    tasks = await taskTable.ToCollectionAsync();

    foreach (var taskId in taskToMove)
    {
        var taskToMove = tasks.First(t => t.Id.ToString() == taskId);

        //_upcomingList.Remove(taskToMove) // DOES NOT REMOVE ITEM

        taskToMove.Status = "In Progress";

        //IPLVItemsSource.Add(taskToMove); // NOW WORKS

        await UpdateTask(taskToMove); //this used for update database?
    }
}


由于无法使用您的代码段重现您的问题,因此,如果您在此处遇到任何问题,请发表评论。

关于c# - ListView不会在拖放时更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38044344/

10-17 02:00