2014-07-15 62 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中添加事件处理程序(如果需要的话)(当然还要删除所有未使用的事件处理程序)。