WPF - дочернему элементу дерева требуется ссылка на его родительский узел в конструкторе, но он получен только после конструктора - требуется решение - PullRequest
1 голос
/ 21 августа 2011

Я получил древовидную структуру в C #.

Каждый узел в дереве содержит ссылку на родителя и коллекцию детей.Процесс создания дочернего узла аналогично -

  1. Родительский узел создает дочерний элемент
  2. Дочерний выполняет всю свою логику конструктора
  3. После того, как дочерний узел имеетвыход из конструктора, его экземпляр добавляется в коллекцию дочерних элементов родителя, а свойство Parent дочернего объекта соответствующим образом обновляется.

До сих пор это прекрасно работало для меня.Я столкнулся с ситуацией, когда некоторым объектам требовалась ссылка на их родительский объект, уже находящийся в конструкторе, даже если у них его еще не было, и он получит его только после того, как выйдет из конструктора и будет добавлен в коллекцию своего родителя.(Как на этапе 3)

Я подумал о возможных решениях, в которых я не уверен -

Каждый родительский узел должен размножаться самому своему потомку при создании.Проблема в этом случае заключается в том, что конструкторы немного короче, но свойство Parent будет установлено дважды.Однажды на шаге 2 и еще раз на шаге 3.

Я подумал, что это должно быть распространенной проблемой, поэтому кто-то должен был найти лучшее решение.

Просто для общих знаний -эта древовидная структура основана на ViewModel для TreeView WPF.

Комментарии будут высоко оценены.

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 августа 2011

Первый вопрос, который я хотел бы задать: почему ваш родительский класс не реализует метод, который выглядит следующим образом?

public void AddChild(object parameters)
{
   Children.Add(new ChildNode(this, parameters));
}

Есть ли в вашем приложении какие-либо другие обстоятельства, в которых ChildNodeобъект может быть создан?Если да, что это такое и почему оно существует?

1 голос
/ 21 августа 2011

Я думаю, что у вас есть один из двух вариантов:

  1. Добавить родительский параметр в качестве параметра конструктора (не так уж и необычно)
  2. Заставить логику, зависящую от родительского, запускаться только послеparent устанавливается либо путем прослушивания события, измененного свойством, либо путем переопределения защищенного виртуального метода OnParentChanged (возможно, лучшего решения).Предполагается, что вы объявляете родительские изменения с использованием стандартного метода доступа, уведомителя об изменении свойства (INotifyPropertyChanged) и защищенной точки доступа виртуального метода для вызова события.Как создатель корневых событий, лучше обрабатывать вашу пользовательскую логику в защищенном методе.

Я бы предпочел второе решение, потому что оно позволит вам перезапустить логику, если ваш узел случитсячтобы получить новое происхождение.Это также позволяет обрезать ваши узлы из дерева (Parent = null).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...