Я понял это с помощью комбинации моих собственных проб и ошибок и подсказок, предоставленных некоторыми другими ответами на этот вопрос.
Ключевым моментом, который мне не хватало, было то, что ViewModel недостаточно для отслеживания DomainContext и раздачи результатов запроса в View для привязки данных. ViewModel также должен захватывать и сохранять результаты запроса, если вы хотите, чтобы добавляемые и удаляемые сущности, выполняемые ViewModel, отображались в пользовательском интерфейсе до DomainContext.SubmitChanges (). ViewModel должна применить эти добавления к представлению коллекции результатов запроса.
Свойство коллекции ViewModel для привязки данных View. В этом случае я использую Telerik QueryableDomainServiceCollectionView , но могут использоваться другие виды коллекций:
public IEnumerable<MyEntity> MyEntities
{
get
{
if (this.view == null)
{
DomainContextNeeded();
}
return this.view;
}
}
private void DomainContextNeeded()
{
this.context = new MyDomainContext();
var q = context.GetMyEntitiesQuery();
this.view = new Telerik.Windows.Data.QueryableDomainServiceCollectionView<MyEntity>(context, q);
this.view.Load();
}
Функция ViewModel, которая добавляет новый объект для отображения интерфейса:
public void AddNewMyEntity(object selectedNode)
{
var ent = new MyEntity() { DisplayName = "New Entity" };
if (selectedNode == null)
{
this.view.AddNew(ent);
}
else if (selectedNode is MyEntity)
{
((MyEntity)selectedNode).Children.Add(ent);
}
}
В других ответах упоминается ObservableCollection. Результаты запроса и представление коллекции могут не возвращать экземпляры ObservableCollection. Они могут быть просто IEnumerables. Важно то, что они реализуют INotifyCollectionChanged и IEditableCollectionView .
Спасибо тем, кто предоставил ответы. Я добавил +1 к каждому ответу, который был полезен, но поскольку никто не решил мою проблему напрямую, я не смог оправдать пометку любого ответа как окончательного.