Создание TreeView с уровня модели

106
6

У меня есть TreeView в моей программе, которая должна быть реализована с уровня модели данных структуры MVVM. Он должен быть реализован таким образом, чтобы программа сохраняла его в данных. Моя программа переключается между разными окнами, и дерево теряется во время этих переключателей, если оно идет только до уровня View Model. У меня есть данные, но представление не отвечает взаимностью (проблема, с которой я, похоже, много в последнее время).

Я отправлю свой процесс здесь. Пожалуйста, имейте в виду структуру этого TreeView:

-Usercontrol (содержит TreeView) → ViewModel-> Модель (TreeView необходимо сохранить в этой модели)

-TreeView → ViewModel-> Модель

Модель UserControl:

public BlockingTreeViewModel _blockDataTree;

public BlockingDatabaseModel() { }

public BlockingTreeViewModel BlockDataTree {...}

Модель UserControl View:

public BlockingDatabaseModel _blockingModel;

public BlockingDatabaseViewModel(BlockingDatabaseModel model, BlockingTreeViewModel blockingTreeView)
{
BlockingModel = model;
BlockingModel.BlockDataTree = blockingTreeView;
}

public BlockingDatabaseModel BlockingModel {...}
public BlockingTreeViewModel BlockingTree //PROXY PROPERTY
{
get { return BlockingModel.BlockDataTree; }
set
{
BlockingModel.BlockDataTree = value;
NotifyPropertyChange(() => BlockingTree);
}
}

UserControl.xaml:

<TreeView ItemsSource="{Binding BlockingModel.BlockDataTree.BlockTree}" ... />

Теперь, добавив в этот TreeView я могу увидеть новый узел при отладке, но в представлении не отображается ни одного вновь созданного узла. Насколько я понимаю эту ситуацию, это выполняется правильно и должно работать нормально. Пожалуйста, помогите мне, почему представление не покажет это дерево внутри UserControl.

Теперь, когда вышеупомянутые изменения были применены к моему xaml, узлы дерева создаются и отображаются. Однако эти узлы исчезают всякий раз, когда я меняю экран. Это означает, что есть еще что - то не так с моей TreeView в этой MVVM структуре.

* Примечание. Свойство TreeView является прокси-ресурсом только потому, что это упрощает мой код в других областях моей программы. Это не должно влиять на то, что я делаю.

Обновление 1:

Снимок экрана моего окна "Местные жители" во время отладки. Это показывает, что я могу создать новый узел в TreeView.

enter image description here

Обновление 2: Обновлены привязки в xaml

спросил(а) 2021-01-19T11:24:01+03:00 2 месяца, 4 недели назад
1
Решение
75

Если вы переключаете экраны, содержащие TreeViews вы не должны создавать новый ObservableCollection каждый раз, когда вы просматриваете TreeView потому что он сбросит текущий.

Я говорю это, потому что каждый раз, когда я возвращался к нему, я создавал новый ObservableCollection в ViewModel моего TreeView.

конструктор моего TreeViewViewModel:

public BlockingTreeViewModel()
{
BlockTree = new ObservableCollection<BlockingTreeModel>();
}

Вместо...:

//Pass the ObservableCollection from a different area of your code each time
//you use BlockingTreeViewModel so that you don't overwrite it.
public BlockingTreeViewModel(ObservableCollection<BlockingTreeModel> treeCollection)
{
BlockTree = treeCollection;
}

ответил(а) 2021-01-19T11:24:01+03:00 2 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема