2014-07-15 115 views
3

在了Windows Phone 8.1的應用程序(目標在運行時不Silverlight的),我有一個綁定到ListView一個ObservableCollection,這樣的定義:的Windows Phone 8.1 ListView.ReorderMode不通知的ObservableCollection

<ListView ItemsSource="{Binding ListItems, Mode=TwoWay}" CanReorderItems="True" ReorderMode="Enabled"> 
    <ListView.ItemTemplate> 
     ...etc... 

在視圖模型的構造,我也有

ListItems.CollectionChanged += ListItems_CollectionChanged; 

這是引發事件,只要任何物品添加和刪除 - 然而,這是從VM不是全部查看處理。不幸的是,當物品重新排序時,事件不會被提出。我已經設置好了,移動了一些項目,在事件處理程序中添加了一個斷點並添加了一個項目,並且我可以看到從View中控制的基礎ObservableCollection的順序已更改。那麼爲什麼事件不會升起?如果不行,在數據庫中堅持ListView的訂單的最佳做法是什麼?

UPDATE:

的問題比我想象的更大的實際...看來,要麼添加一個項目時,ListView.CollectionChanged事件在不觸發!它在應用程序啓動時從數據庫加載它們,但在用戶從UI添加時不會。這很奇怪,因爲添加的項目使用完全相同的方法執行。從數據庫:

private ViewModel MapFromModel(Item model, SQLiteAsyncConnection connection) 
    { 
     var viewModel = new ViewModel 
     { 
      Id = model.Id, 
      Text = model.Text, 
      Description = model.Description, 
      Added = model.Added, 
      Completed = model.Completed, 
      DueOn = model.DueOn, 
      ParentId = model.ParentId, 
      DisplayOrderNumber = model.DisplayOrderNumber, 
      IsNew = false 
     }; 

     foreach (
      var childViewModel in 
       connection.Table<Item>() 
        .Where(ci => ci.ParentId == viewModel.Id) 
        .ToListAsync() 
        .Result.Select(childItem => MapFromModel(childItem, connection))) 
     { 
      if (!_cache.Contains(childViewModel)) 
       _cache.Add(childViewModel); 
      viewModel.AddItem(childViewModel); 
     } 
     return viewModel; 
    } 

你看這個遞歸方法調用視圖模型的的AddItem()方法添加的孩子(這是同一類型的)。我也綁定到一個按鈕一個ICommand增加其他項目:

public void Execute(object parameter) 
    { 
     var viewModel = parameter as ViewModel; 
     if (viewModel == null) return; 

     AddItem(viewModel); 
    } 
public static void AddItem(ViewModel viewModel) 
    { 
     // The DisplayOrderNumber of the new item needs to be the max of the current collection + 1. 
     var displayOrderNumber = viewModel.ListItems.Any() 
      ? viewModel.ListItems.Max(ci => ci.DisplayOrderNumber) + 1 
      : 0; 
     var newText = string.Format("{0} {1}", 
      viewModel.Id == Guid.Empty ? "List" : "Item", displayOrderNumber + 1); 
     var newItem = new ViewModel 
     { 
      Text = newText, 
      NewText = newText, 
      ParentId = viewModel.Id, 
      InEditMode = true, 
      Added = DateTime.Now, 
      DisplayOrderNumber = displayOrderNumber, 
      IsNew = true 
     }; 
     viewModel.AddItem(newItem); 
     viewModel.Save(); 
    } 

那麼爲什麼要的AddItem()方法從視圖模型層本身從服務層調用,但不是當引發事件?

回答

1

事實證明,像往常一樣,故障完全是我的。

這是因爲事件處理方法ListItems_CollectionChanged被斷開連接而發生的。造成這種情況的原因是因爲Sort方法正在取代底層連接。我已經解決了這個問題,通過在屬性的setter中添加事件處理程序(如果需要的話)(當然還要刪除所有未使用的事件處理程序)。