在了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()方法从视图模型层本身从服务层调用,但不是当引发事件?