Я получил одно и то же исключение в другой ситуации.Я работаю с кодом, который берет коллекцию существующих элементов UIElement, создаю новый элемент UIElement и устанавливаю первый в качестве содержимого второго.Кроме того, он берет значение свойства из существующего UIElement и устанавливает его как значение другого свойства нового UIElement.
foreach(UIElement insideElement in uiElementCollection)
{
var outsideElement = new TabItem
{
Content = insideElement
,Header = insideElement.Title
}
}
Но в этом случае заголовок свойства inside может быть Binding, но код выше копирует только значение икогда insideElement.Title привязан к какому-либо источнику, outsideElement.Header не отражает изменения.Поэтому я изменил код для привязки HeaderProperty к TitleProperty insideElement:
foreach(UIElement insideElement in uiElementCollection)
{
var outsideElement = new TabItem
{
Content = insideElement
}
outsideElement.SetBinding(HeaderedContentControl.HeaderProperty,
new Binding
{
Source = insideElement,
Path = new PropertyPath(MyUIElement.TitleProperty)
});
}
Но когда я выполнил код выше, я получил
System.InvalidOperationException: не могу изменить логические дочерние элементы для этогоузел в это время, потому что идет обход дерева.
Я обнаружил, что не могу связать одно свойство зависимости с другим, которое хранится внутри свойства Content.
Iпопытался получить выражение привязки innerUIElement и установить его в качестве новой привязки к HeaderProperty для outsideUIElement.
foreach(UIElement insideElement in uiElementCollection)
{
var outsideElement = new TabItem
{
Content = insideElement
}
BindingExpression titleBindingExpression = pageControl.GetBindingExpression(MyUIElement.TitleProperty);
if (titleBindingExpression != null)
{
tabItem.SetBinding(HeaderedContentControl.HeaderProperty, new Binding { Source = titleBindingExpression.DataItem, Path = titleBindingExpression.ParentBinding.Path });
}
else
{
tabItem.Header = innerUIElement.Title;
}
}
Теперь внешний элемент пользовательского интерфейса привязан к тому же источнику, и презентатор WPF не вызывает исключение.Моя проблема решена.