я выборки данных для окна МОФОВ в backgroundthread, как это [Framework 4.0 с асинхронным/ждать]:Обновление DataContext от Справочной нити
async void refresh()
{
// returns object of type Instances
DataContext = await Task.Factory.StartNew(() => serviceagent.GetInstances());
var instances = DataContext as Instances;
await Task.Factory.StartNew(() => serviceagent.GetGroups(instances));
// * problem here * instances.Groups is filled but UI not updated
}
Когда я включаю действие GetGroups в GetInstances интерфейс показывает группу ,
Когда я обновляюсь в отдельном действии, DataContext включает в себя группы correclty, но пользовательский интерфейс не отображает их.
В методе GetGroups()
я включил NotifyCollectionChangedAction.Reset
для групп ObservableCollection
, и это не поможет.
Необычным является то, что я звоню NotifyCollectionChangedAction.Reset
в список только один раз, но выполняется три раза, а список состоит из десяти элементов ?!
я могу решить эту проблему, написав:
DataContext = await Task.Factory.StartNew(() => serviceagent.GetGroups(instances));
Но это очередной способ для обновления DataContxt и пользовательский интерфейс с помощью процесса Backgound?
На самом деле, я хочу обновить существующий DataContext, не устанавливая его снова?
EDIT: serviceagent.GetGroups(instances)
более подробно:
public void GetGroups(Instances instances)
{
// web call
instances.Admin = service.GetAdmin();
// set groups for binding in UI
instances.Groups = new ViewModelCollection<Groep>(instances.Admin.Groups);
// this code has no effect
instances.Groups.RaiseCollectionChanged();
}
Здесь ViewModelCollection<T>
наследуется от ObservableCollection<T>
и я добавил метод:
public void RaiseCollectionChanged()
{
var handler = CollectionChanged;
if (handler != null)
{
Trace.WriteLine("collection changed");
var e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
handler(this, e);
}
}
Если привязка в файле XAML выполнена правильно, я думаю, что проблема заключается в методе GetGroups. Можете ли вы показать нам этот метод? –
В основном код является просто '{instance.Groups = new ViewModelCollection (webcall); RaiseCollectionChanged(); } ' –
Gerard
Пожалуйста, введите код в вопрос, а не комментарии. Также добавьте любой недостающий соответствующий код. Где вы вызываете Сброс и что он имеет отношение к остальной части вопроса? –