Silverlight TreeView - добавление элемента в корневой узел не обновляет TreeView - PullRequest
0 голосов
/ 11 февраля 2011

У меня есть самореферентная иерархия, которая является сущностью Риа. Я помещаю сущности в ObservableCollection и связываю коллекцию с моим TreeView. Все работает как положено, за исключением того, что когда я добавляю сущность на корневой уровень дерева, пользовательский интерфейс не обновляется.

Я нашел точно такой же вопрос на этом сайте. Однако решения в этих вопросах мне не помогают. Я не знаю, если проблема в разнице между WPF или Silverlight или чем.

Похожие вопросы:
WPF TreeView Вопрос 1
WPF TreeView Вопрос 2

Мой XAML:

<sdk:TreeView.ItemTemplate>
    <sdk:HierarchicalDataTemplate ItemsSource="{Binding ChildTeams}">
        <TextBlock Text="{Binding Name, Mode=OneWay}"/>
    </sdk:HierarchicalDataTemplate>
</sdk:TreeView.ItemTemplate>

Загрузка объектов:

var query = context.GetTeamsQuery();
var loadOperation = context.Load(query);

loadOperation.Completed += (sender, e) =>
{
    Entities.Clear();

    foreach(var item in loadOperation.Entities.Where(t => t.ParentID == null))
    {
        Entities.Add(item);
    }

    treeView.ItemsSource = Entities;
};

Добавление сущности в контекст после того, как новая сущность создается программно:

context.Teams.Add(team);
context.SubmitChanges();

Суть моего вопроса в том, почему добавление сущностей на узлы более низкого уровня работает идеально, а добавление в корень - нет?

Я могу вручную добавить команду в коллекцию (Entities.Add (team)), и это обновит пользовательский интерфейс, но не базу данных. Я пытаюсь избежать такой логики, чтобы предотвратить несинхронизацию набора и набора сущностей.

Я начал все это, просто привязавшись прямо к набору сущностей, но у него то же поведение, что и у ObservableCollection:

treeView.ItemsSource = loadOperation.Entities.Where(t => t.ParentID == null);

Любая помощь приветствуется. Я занимался этим со многих сторон и не могу заставить это работать так гладко, как следовало бы.

Ответы [ 2 ]

0 голосов
/ 25 августа 2011

Теперь мне ясно, что я не должен был ожидать:

  1. Добавление объекта в контекст для отражения в пользовательском интерфейсе.Моя коллекция объектов ObservableCollection отключена от контекста EntitySet.
  2. Добавление объекта в коллекцию OberservableCollection для сохранения в БД.Опять же, они отключены, поэтому сущность, добавляемая в OberservableCollection, не будет волшебным образом оказываться в контексте.
  3. Чтобы использовать EntitySet из контекста непосредственно для пользовательского интерфейса, поскольку он не реализует INotifyCollectionChanged.

В SO и других местах есть множество сообщений обо всем этом.В этом посте это хорошо суммируется, и упоминается, как EF 4.1 решает эту проблему: ObservableCollection лучше, чем ObjectSet

Что касается моего первоначального вопроса о том, почему добавление некорневых сущностей ДЕЙСТВИТЕЛЬНО обновило интерфейс, я думаюявляется родительским узлом, который сумел запустить событие, так как он получал нового дочернего элемента в его EntityCollection дочерних узлов (возможно, через ListChanged).

0 голосов
/ 28 марта 2011
<TextBlock Text="{Binding Name, Mode=OneWay}"/>

Вы пытались использовать привязку TwoWay?

Поскольку вы пытаетесь добавить данные из пользовательского интерфейса обратно в базу данных, вам необходимо установить привязку TwoWay, или, возможно, я не получил правильную информацию о вашем вопросе.

...