Erreur "L'élément spécifié est déjà l'enfant logique d'un autre élément"?
J'ai un TabControl et chaque Onglet peut contenir la même INTERFACE utilisateur, mais avec des données différentes. Dans n'importe quel onglet, l'utilisateur peut cliquer sur un bouton et de faire apparaître une fenêtre pop-up. Ceci définit une propriété de Style pour le ViewModel dire ce qu'est le style à utiliser pour l'INTERFACE utilisateur contextuelle. Le Style devient lié à une coutume DependecyProperty qui est attaché à une coutume PopupUserControl. Mon problème est que lorsque l'une 2ème version de la popup est ouvert dans un autre onglet, j'obtiens l'erreur suivante (indépendamment de ce Style est appliqué):
Élément spécifié est déjà la
logique de l'enfant d'un autre élément.
Débranchez d'abord.
ButtonClick commande:
MyViewModel vm = ((Button)sender).DataContext as MyViewModel;
if (vm != null)
{
Style popupStyle = (Style)Application.Current.FindResource("SomePopupStyle");
vm.EditPanelStyle= popupStyle ;
}
Ce qui déclenche un événement PropertyChange sur le Style
public Style EditPanelStyle
{
get { return _editPanelStyle; }
set
{
if (_editPanelStyle != value)
{
_editPanelStyle = value;
OnPropertyChanged("EditPanelStyle");
}
}
}
Qui déclenche la OnPropertyChanged événement dans le ViewModelBase
protected virtual void OnPropertyChanged(string propertyName)
{
this.VerifyPropertyName(propertyName);
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
L'erreur se produit à la ligne handler(this, e);
dans le ViewModelBase
MODIFIER
La TabItem contient une Toile et un tas de panneaux qui peuvent être ajoutés/supprimés/déplacés/etc. Chaque groupe a son propre répertoire de ressources. De l'intérieur le Panel, je peux mettre le PopupStyle très bien et il est appliqué sans problème. Le Style utilisé dans les panneaux est également définie dans la PanelResourceDictionary.
La principale différence avec celui qui est défaillant et ceux de réussir est le Style qui est situé dans différents endroits.
EDIT #2
Style qui est un échec - LookupDialog est une coutume WPF UserControl
<!-- Popup Style for LookupDialog -->
<Style x:Key="LookupDialogBaseStyle" TargetType="{x:Type localControls:DraggablePanel}" BasedOn="{StaticResource GenericPopupStyle}">
<Setter Property="Canvas.Left" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}},
Path=ActualWidth, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.25}" />
<Setter Property="Canvas.Top" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}},
Path=ActualHeight, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.3}" />
<Setter Property="Width" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}},
Path=ActualWidth, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.5}" />
<Setter Property="Height" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}},
Path=ActualHeight, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.4}" />
<!--<Setter Property="localControls:PopupPanel.PopupEnterKeyCommand" Value="{Binding Path=SaveCommand}" />-->
<Setter Property="localControls:PopupPanel.PopupEscapeKeyCommand" Value="{Binding Path=CancelCommand}" />
<Setter Property="Header" Value="{Binding Path=Header}" />
<Setter Property="localControls:PopupPanel.BackgroundOpacity" Value="0" />
<Setter Property="Content">
<Setter.Value>
<localControls:LookupDialog
DataContext="{Binding}"
BorderBrush="{StaticResource DarkColor}" />
</Setter.Value>
</Setter>
</Style>
<!-- Base Style for a Popup (DraggablePanel) -->
<Style x:Key="GenericPopupStyle" TargetType="{x:Type localControls:DraggablePanel}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type localControls:DraggablePanel}">
<Border Height="{TemplateBinding Height}" Width="{TemplateBinding Width}">
<DockPanel>
<!-- Header -->
<Border
DockPanel.Dock="Top"
MinHeight="20"
Background="{DynamicResource TabItem_BackgroundBrush_Unselected}"
BorderBrush="{StaticResource DarkColor}"
BorderThickness="1"
CornerRadius="5,5,0,0"
Padding="2,3,2,2"
SnapsToDevicePixels="True"
>
<ContentPresenter x:Name="PART_DraggablePanelHeader" ContentSource="Header" />
</Border>
<!-- Content -->
<Border Background="{StaticResource DefaultBackground}"
BorderBrush="{StaticResource DarkColor}"
BorderThickness="1,0,1,1"
SnapsToDevicePixels="True">
<ContentPresenter ContentSource="Content" />
</Border>
</DockPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Style qui Fonctionne:
<!-- Example Popup Style for a Panel -->
<Style x:Key="AgentDesktop_NotesPanelPopupStyle" TargetType="{x:Type ContentControl}">
<Setter Property="Canvas.Left" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}},
Path=ActualWidth, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.2}" />
<Setter Property="Canvas.Top" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}},
Path=ActualHeight, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.32}" />
<Setter Property="Width" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}},
Path=ActualWidth, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.6}" />
<Setter Property="Height" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type localControls:PopupPanel}},
Path=ActualHeight, Converter={StaticResource PercentToDoubleConverter}, ConverterParameter=.36}" />
<Setter Property="localControls:PopupPanel.PopupEnterKeyCommand" Value="{Binding Path=SaveCommand}" />
<Setter Property="localControls:PopupPanel.PopupEscapeKeyCommand" Value="{Binding Path=HidePopupCommand}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<!-- Control Template removed to make this easier to read, but it's created from standard WPF controls with nothing special -->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
source d'informationauteur Rachel
Vous devez vous connecter pour publier un commentaire.
Mon problème est que j'étais réglage de la
Content
dans mon Style, etContent
ne peut pas avoir plus d'une logique parent. J'avais besoin de se déplacer que d'uneTemplate
à la place. Depuis que je ne voulais pas perdre le style de base, j'ai mis le contenu dans leContentTemplate
propriété de la HeaderedContentControl (DraggablePanel dans mon code).+1 à Davy de toute façon pour m'aider à marcher à travers ce.
Assurez-vous que vous êtes en train de créer un nouvel onglet objet et vous êtes, ne pas essayer d'insérer le même onglet dans l'onglet contrôle d'une 2ème fois. Un contrôle ne peut avoir de 1 parent et il semble que le problème est que vous essayez d'insérer un onglet dans 2 récipients différents, ou, plus probablement, le même onglet contrôle à deux reprises.
De ne pas lire tout ce qui précède, la réponse courte est: vous avez besoin de changer
Content
àTemplate
(dans votre XAML le style ou le direct de la déclaration deContentControl
).