2016-06-27 14 views
2

ドラッグ&ドロップ機能をセットアップしようとしている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); 
     }    
    } 
} 
+0

サンプルを共有できますか?投稿されたコードに応じて問題を再現するのは難しいです。 –

+0

こんにちは@ GraceFeng-MSFT。コメントしてくれてありがとう。私は問題の半分がある程度解消されたので、小さなコードだけでなく、より多くのコードを投稿しました。何かがあなたに出てくるか、何か質問がある場合は、私に知らせてください。 – wrigley06

答えて

0

@ GraceFeng-MSFTへの私のコメントで述べたように、私はそれを理解することができました。

private async void InProgressListView_Drop(object sender, DragEventArgs e) 
{ 
    ObservableCollection<Tasks> sourceListView = upcomingListView?.ItemsSource as ObservableCollection<Tasks>; 

    await vm.IPLV_Drop(sourceListView, sender, e); 
} 

:この問題がある可能性があります他の誰のために、ここに私の最終的な解決策は InProgressListView_Drop() でMainPAge.xaml.csIPLV_Drop() でMainPageViewModel.csにいくつかの微調整が含まれていたように見えることになったものです
public async Task IPLV_Drop(ObservableCollection<Tasks> source, 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>; 

    ObservableCollection<Tasks> test = source; // TODO: Change var name 

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

      source.Remove(taskToMove); 

      taskToMove.Status = "In Progress"; 
      IPLVItemsSource.Add(taskToMove); 

      await UpdateTask(taskToMove); 
      await RefreshTasks(); 
     } 
    } 
} 
2

IPLV_Dropタスクでは、tasksToMovetaskToMove持っています(私はあなたがあなたの投稿されたコードでこれを定義するところを見ることができません)、taskIDを01にトラバースしましたとし、tasksコレクションでは、taskIDと一致する最初のコレクションを見つけます。

あなた_inProgressList_upcomingListは、これら2つのコレクションを操作するとき、アイテムのデータモデルは<Tasks>する必要があり、ObservableCollection<Tasks>です。今すぐMobileServiceCollection<Tasks, Tasks> tasksからアイテムを取得しましたが、tasks = await taskTable.ToCollectionAsync();を最初に使用したため、アイテムのデータモデルは変更されましたが、Collectionである必要があります。<Tasks>ではありません。私は、タスクテーブルが更新されます見ることができるので、私はアプリを実行し、次の1つのリストビューから項目をドラッグしようとすると

、何が画面に起こりません、しかし、のawait UpdateTask(taskToMoveは)間違いなく、正常に動作しますデータベースと私はアプリの次回実行時に、...

だから私は、あなたがUIをリフレッシュしたい場合、あなたはおそらく必要がある、foreach (var taskId in taskToMove)の中に発見項目は、データベース操作のためだけに使用することができると思います次のようなコード:

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? 
    } 
} 

コードスニペットを使用して問題を再現できないため、ここに問題がある場合はコメントを残してください。

+0

こんにちは@ GraceFeng - MSFT、このポストのおかげで。 ObservableCollectionsのいずれかに追加または削除するためにtaskToMoveを使用することはできません。これは、Idを含む文字列であり、Tasksエントリ全体ではないからです。しかし、あなたが「 '' 'tasks = taskTable.ToCollectionAsync();を待っているとき、最初にアイテムのデータモデルが変更されたので...' ''あなたは私に考えさせました。私が 'taskTable.ToCollectionAsync();でMobileServiceを呼び出すことに関連していた問題は、以下の完全な解決策を投稿しますが、その呼び出しを削除すると私の問題は解決しました。すべてのあなたの助けをありがとう! – wrigley06

+0

@ wrigley06、OK、あなたが 'MobileServiceCollection'でアイテムを見つけるのに使ったコードのように' _inProgressList'と '__inProgressList'にある比較可能なアイテムを見つけるために、taskToMove in tasksToMoveという文字列型を使うと、オブジェクトをObservableCollectionに追加して追加/削除します。 –

+0

私は、別の方法として、_upcomingListを反復し、 'if(_upcomingList [j] .Id == taskId){_upcomingList.RemoveAt(j); _inProgressList.Add(taskToMove); } 'それはあなたが思っていたことの線に沿っているのですか?もしそうなら、それがパフォーマンスにプラスの影響を与えると思いますか? – wrigley06

関連する問題