在了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()方法從視圖模型層本身從服務層調用,但不是當引發事件?