Исключение «Элемент уже является логическим дочерним элементом другого элемента», даже если коллекция элементов очищенаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Исключение «Элемент уже является логическим дочерним элементом другого элемента», даже если коллекция элементов очищена

Сообщение Anonymous »

Происходящее исключение говорит само за себя:

System.InvalidOperationException: 'Элемент уже имеет логический
родительский элемент. Его необходимо отсоединить от старого родителя, прежде чем присоединить
к новому.'

Однако в этом нет смысла выдается в конце следующего метода, который представляет собой обработчик событий, который обновляет значок, отображаемый в NavigationItem (UserControl), инициируемый отдельным исполняемым потоком, который проверяет состояние соединения и запускает событие, если состояние соединения изменилось (т. е. был отключен -> теперь подключено, и наоборот).
Метод, в конце которого создается исключение:

Код: Выделить всё

void OnMachineConnectionStatusChangedHandler(object source, EventArgs e)
{
Dispatcher.Invoke(() =>
{

Machine machine = source as Machine;

// obtain the TreeViewItem representing this machine in the navigation tree

lock (_navigationTree)
{
foreach (TreeViewItem navigationItem in _navigationTree.Items)
{

NavigationItem machineNavItem = navigationItem.Header as NavigationItem;

if (machineNavItem.Machine.Equals(machine))
{
lock (machineNavItem)
{
machineNavItem.Refresh(); // changes shown icon

if (machine.Connected)
{
if (navigationItem.Items.Count > 0)
navigationItem.Items.Clear(); // clear prev.  items shown under

TreeViewItem TO = new TreeViewItem()
{
Header = "TO",
Padding = new Thickness(0, 2.5, 10, 2.5)
};
TreeViewItem WO = new TreeViewItem()
{
Header = "WO",
Padding = new Thickness(0, 2.5, 10, 2.5)
};
TreeViewItem EWO = new TreeViewItem()
{
Header = "EWO",
Padding = new Thickness(0, 2.5, 10, 2.5)
};

List machineHolds = machine.getActiveHoldNumbers();

if (machineHolds.Count > 1)
{
foreach (int hold in machineHolds)
{
TreeViewItem holdItem = new TreeViewItem() { Header = ("#" + hold) };
TO.Items.Add(hold);
WO.Items.Add(hold);
EWO.Items.Add(hold);
}

}

navigationItem.Items.Add(TO);
navigationItem.Items.Add(WO);
navigationItem.Items.Add(EWO);

navigationItem.IsExpanded = false;
}
}
}
}
}

this.UpdateLayout();
}); // here, the Exception is thrown
}
Я выполнял отладку с помощью VS, проходя каждую строку, и в целом ничего не вызывает исключений, кроме как в конце.
Для справки, вот структуру UserControl NavigationItem, если она имеет какое-либо значение:

Код: Выделить всё

public partial class NavigationItem : UserControl
{
// fields
private Machine _machine;

// properties
public Machine Machine
{
get { return _machine; }
}

public NavigationItem(Machine machine)
{
InitializeComponent();

_machine = machine;

if (_machine.Connected)
_statusImage.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/Checkmark-Icon.png"));
else
_statusImage.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/X-Icon.png"));

_machineNameLabel.Content = _machine.Name;
}

public void Refresh()
{
if (_machine.Connected)
_statusImage.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/Checkmark-Icon.png"));
else
_statusImage.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/X-Icon.png"));
}
}
Будем очень признательны за любую помощь или рекомендации относительно того, почему это исключение выдается и как его исправить.

Подробнее здесь: https://stackoverflow.com/questions/632 ... en-when-co
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»