我有两个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
任务中,有一个tasksToMove
和taskToMove
(我看不到在发布的代码中定义的位置),然后先遍历taskID
和集合中找到与taskToMove
匹配的第一个。
您的tasks
和taskID
是_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/