Держите поддерево TreeView развернутым после обновления набора данных - PullRequest
1 голос
/ 20 августа 2009

Я работаю с CTP за июль '09 сервисов .Net RIA и привязываю объект объектов Group => Department => Category к древовидному представлению, а затем использую иерархическую таблицу данных для рендеринга каждого из трех типов объектов.

Моя конечная цель для этого заключается в том, чтобы включить функцию перетаскивания, чтобы я мог быстро редактировать свой список групп => отделы => категории и изменять их соответствующие отношения более интуитивно понятным способом, чем было ранее доступно.

Моя текущая проблема заключается в том, что когда я выполняю команду удаления и отправляю изменения, которые необходимо отправить в контекст данных, мое древовидное представление перерисовывается и сворачивает листья. Есть ли способ, с помощью которого я могу избежать коллапса?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Я публикую этот ответ исключительно для тех, кто наткнулся на эту ветку в поисках ответа. (сделано в SL4)

вам понадобится 2 списка:

  1. один, чтобы содержать полученные данные от службы (называемые sourceList)
  2. один для хранения корневых записей для отображения (DisplayList), к которым привязан ваш treeView.

Вы также должны убедиться, что в вашей операции Load для LoadBehaviour установлено значение Merge. например:

    domainContext.Load(domainContext.GetEntityQuery(), LoadBehavior.MergeIntoCurrent, CallbackFunction, userState);

так что все, что остается сейчас - это вызывать ваш domainContext.Load после каждого обновления и в вашей CallbackFunction заменять свой sourceList новым списком сущностей, возвращаемых веб-службой. Так как записи детализации вашего списка отображения основаны на ассоциации и иерархическом шаблоне данных, его все равно следует расширить на только что отредактированную запись.

Примечание Если перестроить DisplayList с нуля, древовидная структура, очевидно, будет перерисована \ свернута.

Надеюсь, это кому-нибудь поможет. Jan

0 голосов
/ 22 ноября 2009

Я не проделал большую работу с Silverlight, но из того, что я видел, он имеет довольно ограниченную объектную модель, поэтому некоторые из событий / свойств / методов для этого могут отсутствовать. Но вы можете попытаться сохранить / восстановить состояние самостоятельно ... что-то похожее на следующий псевдокод:

private expandeds as collection();

tree.OnNodeExpand() {
    expandeds.add(tree.CurrentNode.key);
}

tree.OnNodeCollapse() {
    expandeds.remove(tree.CurrentNode.key);
}

tree.AfterBind() {
    for each key in expandeds {
        tree.FindNodeByKey(key).expanded = true;
    }
}
...