ドラッグ&ドロップ機能をセットアップしようとしている2つのリストビューがあります。各ListViewはObservableCollection(_upcomingListと_inProgressList)にバインドされたデータです.Threadsは私のモデルの1つです。リストビューがドラッグアンドドロップで更新されない
DragItemsStartingメソッドが呼び出されると、(ListViewバインドから_upcomingListにドラッグされている)アイテムのIDが文字列に格納され、DataPackageとして設定されます。次に、アイテムが2番目のListView(_inProgressListにバインドされている)にドロップされると、IDはDataPackageから抽出され、私はそれを使用してdb内の完全なエントリを検索します。最後に、アイテムのステータスが「進行中」に変更され、_inProgressListに追加されます。
アプリケーションを実行してListViewから次のListViewにアイテムをドラッグしようとすると、await UpdateTask(taskToMove)
が正しく実行されますが、タスクテーブルがデータベース内で更新され、次のアプリケーションを実行すると、In Progress ListViewにドラッグしようとしたタスクが表示されます。ここに私のドロップ方式の実装は、(更新セクションの下に新しいバージョンがあります)です。
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のバインドが更新されるようにしたりします。
この記事をお読みいただきありがとうございます。
UPDATE
私は最近、ドラッグを発見し、私は私のドロップ方式ビットを変化させシェンChauhanさんのブログ(http://www.shenchauhan.com/)上の例をドロップします。今度はドロップされたアイテムを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);
}
}
}
サンプルを共有できますか?投稿されたコードに応じて問題を再現するのは難しいです。 –
こんにちは@ GraceFeng-MSFT。コメントしてくれてありがとう。私は問題の半分がある程度解消されたので、小さなコードだけでなく、より多くのコードを投稿しました。何かがあなたに出てくるか、何か質問がある場合は、私に知らせてください。 – wrigley06